第十七節: EF的CodeFirst模式的四種初始化策略和通過Migration進行數據的遷移


一. 四種初始化策略

  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 : 原創博客請在轉載時保留原文鏈接或在文章開頭加上本人博客地址,否則保留追究法律責任的權利。
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM