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     }
View Code

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     }
View Code

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     }
View Code

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 }
View Code

那么最后,当在正式环境当中,怎么禁用这些初始化策略呢?

 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     }
View Code

其实用EF的目的,就是写更少的代码,你甚至可以不用了解db。现在的问题是当model改变,怎么办?这就用到了CodeFirst数据库迁移。

 

posted @ 2017-05-24 13:27  Dukezhou  阅读(127)  评论(0)    收藏  举报