EF CodeFirst之四大初始化策略
随着业务的发展,我们在开发当中可能会添加字段,添加表。怎么来解决了?CodeFirst给我们提供了一下四大策略:
官方文档:http://www.entityframeworktutorial.net/code-first/database-initialization-strategy-in-code-first.aspx
1.CreateDatabaseIfnotExists (默认的策略)
特性:1.数据库不存在,创建数据库
2.model修改,执行会抛出异常
这是开发当中最稳定的一种方式,不会存在说数据库里面的数据突然被删除。
1 public class SchoolDB2Entities : DbContext 2 { 3 public SchoolDB2Entities() : base("data source=.;initial catalog=SchoolDB2;integrated security=True") 4 { 5 //数据库不存在,创建数据库,model修改,执行会抛出异常 6 Database.SetInitializer<SchoolDBContext>(new CreateDatabaseIfNotExists<SchoolDBContext>()); 7 } 8 9 public DbSet<Student> Students { get; set; } 10 11 public DbSet<StudentAddress> StudentAddresses { get; set; } 12 13 protected override void OnModelCreating(DbModelBuilder modelBuilder) 14 { 15 16 } 17 }
2.DropCreateDatabaseIfModelChanges
特性:一旦model修改了,将会执行dropdatabase(删除数据库)操作。
缺点:一旦你有原始数据,那么对不起,都会被删除。(所以在生成环境中,谨慎使用)
1 public class SchoolDB2Entities : DbContext 2 { 3 public SchoolDB2Entities() : base("data source=.;initial catalog=SchoolDB2;integrated security=True") 4 { 5 //model一旦修改,db进行rebuild 6 Database.SetInitializer<SchoolDB2Entities>(new DropCreateDatabaseIfModelChanges<SchoolDB2Entities>()); 7 } 8 9 public DbSet<Student> Students { get; set; } 10 11 public DbSet<StudentAddress> StudentAddresses { get; set; } 12 13 protected override void OnModelCreating(DbModelBuilder modelBuilder) 14 { 15 16 } 17 }
3.DropCreateDatabaseAlways
特性:一直都是rebuild(重建)操作,db每次都会重建。
1 public class SchoolDB2Entities : DbContext 2 { 3 public SchoolDB2Entities() : base("data source=.;initial catalog=SchoolDB2;integrated security=True") 4 { 5 //一直都是rebuild操作。。。 6 Database.SetInitializer<SchoolDB2Entities>(new DropCreateDatabaseAlways<SchoolDB2Entities>()); 7 } 8 9 public DbSet<Student> Students { get; set; } 10 11 public DbSet<StudentAddress> StudentAddresses { get; set; } 12 13 protected override void OnModelCreating(DbModelBuilder modelBuilder) 14 { 15 16 } 17 }
4.Custom DB Initializer
特性:自定义初始化,重写override,可以做一些种子数据。。(数据库的基础数据)
1 namespace ConsoleApplication19 2 { 3 public class SchoolDB2Entities : DbContext 4 { 5 public SchoolDB2Entities() : base("data source=.;initial catalog=SchoolDB2;integrated security=True") 6 { 7 //用自定义的数据库初始化类 8 Database.SetInitializer<SchoolDB2Entities>(new MyCustomIntializer()); 9 } 10 11 public DbSet<Student> Students { get; set; } 12 13 public DbSet<StudentAddress> StudentAddresses { get; set; } 14 15 protected override void OnModelCreating(DbModelBuilder modelBuilder) 16 { 17 18 } 19 //自定义的数据库初始化类 20 public class MyCustomIntializer : DropCreateDatabaseAlways<SchoolDB2Entities> 21 { 22 public override void InitializeDatabase(SchoolDB2Entities context) 23 { 24 base.InitializeDatabase(context); 25 } 26 27 //重写seed,追加初始数据 28 protected override void Seed(SchoolDB2Entities context) 29 { 30 for (int i = 0; i < 10; i++) 31 { 32 context.Students.Add(new Student() 33 { 34 StudentName = "mary" + i 35 }); 36 } 37 38 context.SaveChanges(); 39 40 base.Seed(context); 41 } 42 } 43 } 44 }
那么最后,当在正式环境当中,怎么禁用这些初始化策略呢?
1 public class SchoolDB2Entities : DbContext 2 { 3 public SchoolDB2Entities() : base("data source=.;initial catalog=SchoolDB2;integrated security=True") 4 { 5 //禁用数据库初始化策略 6 Database.SetInitializer<SchoolDB2Entities>(new NullDatabaseInitializer<TContext>()); 7 } 8 9 public DbSet<Student> Students { get; set; } 10 11 public DbSet<StudentAddress> StudentAddresses { get; set; } 12 13 protected override void OnModelCreating(DbModelBuilder modelBuilder) 14 { 15 16 } 17 }
其实用EF的目的,就是写更少的代码,你甚至可以不用了解db。现在的问题是当model改变,怎么办?这就用到了CodeFirst数据库迁移。

浙公网安备 33010602011771号