以前在使用ADO.NET Entity Framework开发时,碰到过一个问题,Model和数据层不能完全分离。之后在ADO.NET Entity Framework 4中又有了ModelFirst模式,现在在ADO.NET Entity Framework Feature中又增加了CodeFirst模式。本文介绍通过Model代码生成数据库及从数据库生成Model代码。
从代码生成数据库
既然是CodeFirst,当然需要Code完成后能自动生成数据库了。
1. 添加对EntityFramework和System.Data.Entity的引用。
2. 写一个User类和Group类,User和Group是多对一的关系
![]()
用户实体类
1 /// <summary> 2 /// 用户实体类 3 /// </summary> 4 public class User 5 { 6 /// <summary> 7 /// ID 8 /// </summary> 9 public Guid ID { get; set; } 10 11 /// <summary> 12 /// 名字 13 /// </summary> 14 public string Name { get; set; } 15 16 /// <summary> 17 /// 用户组别 18 /// </summary> 19 public virtual Group Group { get; set; } 20 }
![]()
用户组实体类
1 /// <summary> 2 /// 用户组实体类 3 /// </summary> 4 public class Group 5 { 6 /// <summary> 7 /// ID 8 /// </summary> 9 public Guid ID { get; set; } 10 11 /// <summary> 12 /// 组名 13 /// </summary> 14 public string Name { get; set; } 15 16 /// <summary> 17 /// 用户集合 18 /// </summary> 19 public virtual ICollection<User> Users { get; set; } 20 }
3. 写一个继承自DBContext的类
![]()
DataContext
1 /// <summary> 2 /// 数据上下文 3 /// </summary> 4 public class DataContext : DbContext 5 { 6 /// <summary> 7 /// 用户 8 /// </summary> 9 public DbSet<User> Users { get; set; } 10 11 /// <summary> 12 /// 用户组 13 /// </summary> 14 public DbSet<Group> Groups { get; set; } 15 }
这里我们还可以重写OnModelCreating方法来对数据库的生成做一些设置,如某些列的最大长度等信息。
4. 检查数据库连接字符串
默认的数据库连接字符串将连接到.\SQLEXPRESS实例,这个是可以修改的。一个修改方法是在DataContext的构造函数中修改。如:
1 /// <summary> 2 /// 构造函数 3 /// </summary> 4 public DataContext() 5 : base("EFCodeFirstStartConnectionString") 6 { 7 }
其中EFCodeFirstStartConnectionString是连接字符串的名字
5. 当你对数据库执行操作时,如果它不存在,就会按照Model的代码来创建一个。也可以显式地用代码来创建。
1 DbContext.Database.CreateIfNotExists();
或
1 DbContext.Database.Create();
从数据库生成代码
如果已经有数据库了也不必完全手写Model代码。
1. 新建一个ADO.NET Entity Data Model
![]()
2. 选择Generate from database
![]()
3. 选择需要生成代码的表
![]()
4. 右键单击emdx文件并选择Add Code Generation Item
![]()
5. 在弹出的Add New Item对话框中选择ADO.NET DbContext Generator
![]()
6. 在Solution Explorer中可以找到模版文件和生成的代码文件
![]()
示例下载(Visual Studio 2010)