1. 程式人生 > >EF CodeFirst下,當實體結構發生修改怎麼更新資料庫結構

EF CodeFirst下,當實體結構發生修改怎麼更新資料庫結構

在使用EF的實際程式設計中我們經常遇到這樣的問題:發現實體結構需要新增加一個欄位,或者減少一個欄位,急需把實體結構修改,並讓資料庫更新這種修改。在用Model First或者Database First的情況下我們可以通過在實體檢視介面下生成更改資料庫資料結構的sql語句,然後通過執行這些sql語句來完成資料庫的修改。可Code First下應該怎麼辦呢。

其實我們可以通過程式包管理控制檯的命令來完成這種修改:

如下面的實體類程式碼,紅底黃字部分是我新增的一個新的欄位,現在我需要讓資料庫也跟著進行改變:

public class Book
    {
        public int Id { get; set; }
        public string Name { get; set; }

    public string Author { get; set; }

public decimal Price {get;set;}

        public List<BookReview> Reviews { get; set; }

    }

首先開啟程式包管理控制檯:


在程式包管理控制檯輸入命令:enable-migrations


可以看到,系統出現提示,大體意思是我的這個程式集中有多個上下文型別(我這是一個做實驗的程式集,建立了兩個EF上下文型別)。一般情況下不會出現這個提示,一個程式集中有多個上下文型別才會出現這個提示。

出現這種提示之後在提示的命令中選擇一個,決定要對哪個上下文型別進行遷移就行了,我選擇遷移我的“EF原理探究.BookDb”,那麼只需要按照提示急需在程式包管理控制檯輸入:Enable-Migrations -ContextTypeName EF原理探究.BookDb。


在執行完命令之後就會發現自己的專案檔案裡面多了一個Migrations檔案,下一步我們需要對這個檔案進行操作。

開啟Migrations資料夾下面的Configuration.cs檔案會發現程式碼如下:

internal sealed class Configuration : DbMigrationsConfiguration<EF原理探究.BookDb>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = false;

            AutomaticMigrationDataLossAllowed = true;//這是我自己新增的

        }


        protected override void Seed(EF原理探究.BookDb context)
        {
            //  This method will be called after migrating to the latest version.


            //  You can use the DbSet<T>.AddOrUpdate() helper extension method 
            //  to avoid creating duplicate seed data.
        }
    }

我們只需在Configuration類的建構函式裡面插入一句:AutomaticMigrationDataLossAllowed = true;就行了。然後在程式包管理控制檯輸入命令:updata-database就完成了這種修改,當然,很多情況下執行updata-database修改會報錯,如果報錯我們可以強制執行,只需加上一個引數-force,完整命令:updata-database -force


這樣就代表遷移成功了!

當然,也有朋友喜歡直接更改資料庫的方式完成資料庫與實體類的統一,但是這有一個問題,如果在更改了實體類之後直接更改資料庫,在統計數目的時候,如db.實體類.count();會發現資料不對,制定了新欄位的資料會統計不進來,各種問題。