Code First:顾名思义:就是通过代码生成数据库----通过类生成数据库中对应的表:
首先定义两个类(就是建模的过程):
1 public class Order 2 { 3 public int OrderId { set; get; } 4 5 public string OrderCode { set; get; } 6 7 public string CustormName { set; get; } 8 9 public ICollection<OrderDetail> OrderDetails { set; get; } 10 }
1 public class OrderDetail 2 { 3 public int OrderDetailID{set;get;} 4 public int OrderId { set; get; } 5 public decimal Cost { set; get; } 6 public Order Order { set; get; } 7 }
主要通过 DbContext实现的,所以要定义一个继承DbContext的基类
public class DbEntities:DbContext { //对应实体的 两个类,生成对应的数据库中的表 public DbSet<Order> Orders { set; get; }//set/get:代表是可读写的 public DbSet<OrderDetail> OrderDetails { set; get; } static DbEntities() { Database.SetInitializer<DbEntities>(new DropCreateDatabaseIfModelChanges<DbEntities>());//如果没有这条语句,那么模型和 数据库架构不同时 就会报错 } }
重要讲解的是这个静态构造函数:相当于对于整个应用程序域建立了一个标准,当初始化 DbContext的时候就会通过调用Database 的初始化的方法 SetInitiallizer方法进行检查现在的模型和数据库的架构是否相同,如果不相同 就通过参数
new DropCreateDatabaseIfModelChanges<DbEntities>() 删除数据库然后新建。
这时可能大家就会问了,内部是通过什么进行检查模型和数据库的架构是否相同的呢?
如果大家注意的话,就会发现,当我们生成数据库的时候会发现,生成我们定义的数据库表的同时页生成了一个 名字为EdmMetadata,而且他的里面一面只有两个一个字段(一个是Id,另一个就是Modelhash),这个Modelhash很重要:是通过模型生成的对应的hash值,当初始化的时候就会 先对当前模型生成对应的 hash 然后和这个字段进行比对,如果相同就不删除重建,如果不同就删除重建。