一. 四種初始化策略
EF的CodeFirst模式下數據庫的初始化有四種策略:
1. CreateDatabaseIfNotExists:EF的默認策略,數據庫不存在,生成數據庫;一旦model發生變化,拋異常,提示走數據遷移
2. DropCreateDatabaseIfModelChanges:一旦model發生變化,刪除數據庫重新生成
3. DropCreateDatabaseAlways:數據庫每次都重新生成
4. 自定義初始化(繼承上面的三種策略中任何一種,然后追加自己的業務)
關閉數據庫初始化策略:
Database.SetInitializer<dbContext6>(null); (改變實體類,不會報錯,不會丟失數據,但無法映射改變數據庫結構了)
代碼如下:
public class dbContext6 : DbContext { public dbContext6() : base("name=dbContext6") { //在這里可以改變生成數據庫的初始化策略 //1. CreateDatabaseIfNotExists (EF的默認策略,數據庫不存在,生成數據庫;一旦model發生變化,拋異常,提示走數據遷移) //Database.SetInitializer<dbContext6>(new CreateDatabaseIfNotExists<dbContext6>()); //2. DropCreateDatabaseIfModelChanges (一旦model發生變化,刪除數據庫重新生成) //Database.SetInitializer<dbContext6>(new DropCreateDatabaseIfModelChanges<dbContext6>()); //3.DropCreateDatabaseAlways (數據庫每次都重新生成) //Database.SetInitializer<dbContext6>(new DropCreateDatabaseAlways<dbContext6>()); //4. 自定義初始化(繼承上面的三種策略中任何一種,然后追加自己的業務) //Database.SetInitializer<dbContext6>(new MySpecialIntializer()); //5. 禁用數據庫策略(不會報錯,不會丟失數據,但是改變不了數據庫的結構了) //Database.SetInitializer<dbContext6>(null); } public DbSet<Animal> Animal { get; set; } public DbSet<AnimalKind> AnimalKind { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); } /// <summary> /// 自定義一個初始化策略,每次初始化時追加10條數據 /// </summary> public class MySpecialIntializer : DropCreateDatabaseAlways<dbContext6> { public override void InitializeDatabase(dbContext6 context) { base.InitializeDatabase(context); } //重寫seed,追加初始數據 protected override void Seed(dbContext6 context) { for (int i = 0; i < 10; i++) { context.Animal.Add(new Animal() { id = "animal" + i, animalName = "mru" + i, animalKind = "mruru" + i, }); } context.SaveChanges(); base.Seed(context); } } }
總結:以上四種初始化策略,讓我們知道了上一個章節中,為什么數據庫結構發生變化就會拋異常,但是無論哪種方式,還是沒有解決數據丟失的問題,解決數據丟失問題,詳見:數據遷移。
二. 數據遷移(代碼的形式非指令)
數據遷移很好的解決了修改表結構,數據丟失的問題,在本章節介紹通過代碼的形式處理數據遷移問題,指令控制的形式,在后面章節介紹。
步驟:
①:新建Configuration.cs類,在其構造函數中進行相關配置。
②:改變數據庫的初始化策略為,MigrateDatabaseToLatestVersion ,並在Configuration類中配置開啟自動遷移:AutomaticMigrationsEnabled = true;
③:顯式開啟允許修改表結構:AutomaticMigrationDataLossAllowed = true; (默認是關閉的)
進行測試:
① 增加一列:改變Animal類,增加一個字段,刷新數據庫,發現數據多了一列 (無需特別的配置),但后面再次增加,還是需要配置AutomaticMigrationDataLossAllowed設置為true
② 刪除一列、修改列、改變列的屬性:報錯,提示需要將AutomaticMigrationDataLossAllowed設置為true, 設置后,修改或刪除成功。
③ 增加一張表:增加一個AnimalKind類,運行代碼,發現數據庫多了一張表。
④ 刪除表:注釋掉:public DbSet<AnimalKind> AnimalKind { get; set; } ,運行代碼,數據庫中AnimalKind表被刪除.
代碼如下:
1 internal sealed class Configuration : DbMigrationsConfiguration<dbContext6> 2 { 3 public Configuration() 4 { 5 AutomaticMigrationsEnabled = true; //啟用自動遷移 6 AutomaticMigrationDataLossAllowed = true; //更改數據庫中結構(增加、刪除列、修改列、改變列的屬性、增加、刪除、修改表),需要顯示開啟。 7 } 8 9 }
1 public class dbContext6 : DbContext 2 { 3 4 public dbContext6() 5 : base("name=dbContext6") 6 { 7 8 //數據庫遷移配置 9 10 //數據庫遷移的初始化方式 11 Database.SetInitializer(new MigrateDatabaseToLatestVersion<dbContext6, Configuration>("dbContext6")); 12 13 14 15 } 16 17 public DbSet<Animal> Animal { get; set; } 18 19 public DbSet<AnimalKind> AnimalKind { get; set; } 20 21 22 protected override void OnModelCreating(DbModelBuilder modelBuilder) 23 { 24 base.OnModelCreating(modelBuilder); 25 } 26 27 }
!
- 作 者 : Yaopengfei(姚鵬飛)
- 博客地址 : http://www.cnblogs.com/yaopengfei/
- 聲 明1 : 本人才疏學淺,用郭德綱的話說“我是一個小學生”,如有錯誤,歡迎討論,請勿謾罵^_^。
- 聲 明2 : 原創博客請在轉載時保留原文鏈接或在文章開頭加上本人博客地址,否則保留追究法律責任的權利。