EF Core Model更新遷移

EF Core 遷移

感受就是之前EF Code First的自動同步數據庫功能html

內容:在你新增、更新TableModel後,如何自動化的更新DB中的真實Table。以及對這些更改進行一個版本控制。web

本文將以一個示例進行簡單明瞭的演示輸出。(不會很詳細,只記錄主要步驟)sql

當下咱們已經有了一個ASP.NET Core的web應用程序,本文咱們所關心的只有2個:
一、Model
二、DB Table數據庫

當下:

Modelexpress

最後一個爲導航屬性,無視。c#

Tableide

如今咱們要在Model/Student.cs 加一個屬性ui

public string NewColForTest { get; set; }

更改後版本控制

對應的Table,咱們但願變成以下code

如何操做呢?

辦法有不少,本文介紹由EF Core提供的一種遷移。

優勢

  • 不須要去手動操做數據庫
  • 不會影響現有db data(也就是否是重建db)
  • 可追溯更改內容,即版本控制

開始動手

前期準備

建一個ASP.NET Core web Application,用EF Core鏈接好數據庫,建好Student.cs

編輯*.csproj 文件,添加highlight內容

cmd 定位到項目根目錄(即Startup.cs所在目錄)

dotnet ef migrations add InitialCreate

將初始化EF Core用於遷移的文件。InitialCreate是其中一個遷移記錄的版本文件名,暫不關心。

如今你的項目中將多出:

【SchoolContext】ModelSnapshot裏面記錄了要生成db的內容。

20180513071210_【InitialCreate】記錄了這次更新(同上個版本)的部分,因爲咱們是第一次初始化,因此裏面記錄了所有表結構內容。

【SchoolContext】ModelSnapshot:

partial class SchoolContextModelSnapshot : ModelSnapshot
    {
        protected override void BuildModel(ModelBuilder modelBuilder)
        { 
            modelBuilder
                .HasAnnotation("ProductVersion", "2.0.2-rtm-10011")
                .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);

           ...

            modelBuilder.Entity("ContosoUniversity.Models.Student", b =>
                {
                    b.Property<int>("ID")
                        .ValueGeneratedOnAdd();

                    b.Property<DateTime>("EnrollmentDate");

                    b.Property<string>("FirstMidName");

                    b.Property<string>("LastName");

                    b.Property<string>("NewColForTest");

                    b.HasKey("ID");

                    b.ToTable("Student");
                });

            ...
        }
    }

20180513071210_【InitialCreate】:

public partial class InitialCreate : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            ...

            migrationBuilder.CreateTable(
                name: "Student",
                columns: table => new
                {
                    ID = table.Column<int>(nullable: false)
                        .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
                    EnrollmentDate = table.Column<DateTime>(nullable: false),
                    FirstMidName = table.Column<string>(nullable: true),
                    LastName = table.Column<string>(nullable: true)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_Student", x => x.ID);
                });

           ... 
        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {
            ...
            migrationBuilder.DropTable(
                name: "Student");
        }
    }

回到cmd 定位到項目根目錄

dotnet ef database update

EF Core將爲咱們跟db同步

如今咱們的db應該跟Model是一致的(多餘的細節,這裏就不贅述了)

作到這裏,咱們應該清楚EF Core是經過生成/Migrations Folder的內容來實現同步db。

此時還會新生成一個表用於版本記錄

EF Core 使用 __MigrationsHistory 表查看是否須要運行任何遷移。 若是 DB 已經是最新,則無需運行遷移。

Now

更改Student.cs

添加新屬性NewColForTest

按照咱們的猜想,要同步更新db,應該就是更改/Migrations Folder裏的內容。把該屬性對應的添加上去,而後執行

dotnet ef database update

便可實現同步更新(遷移)。

如今這裏能夠手動更改/Migrations Folder裏的兩個文件,而後執行cmd。

那麼能夠不手動嗎?

能夠,先執行命令,生成一個新的差別版本Migration,咱們命名爲UpdateStudent

dotnet ef migrations add UpdateStudent

結果

點開文件

只有差別內容。

public partial class UpdateStudent : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.AddColumn<string>(
                name: "NewColForTest",
                table: "Student",
                nullable: true);
        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropColumn(
                name: "NewColForTest",
                table: "Student");
        }
    }

最後執行

dotnet ef database update

查看咱們的db

原有的數據也仍在。完成。

注意:若是命令報錯,能夠檢查是否把iis express退出。

總結

我以爲很大一個亮點是每次更新都生成一個追蹤版本,某些狀況下,省去了單獨維護sql 腳本的工做。

與EF Code First比較,運行的更加「透明」,讓咱們更直接的知道發生了什麼,黑魔法的感受少了不少。Code First更新在配置完成下只須要運行F5,即DB 同步成功,讓人感受不是那麼「親近」。

認識較淺,請指教。

Thanks All.

歡迎討論~
感謝閱讀~

我的公衆號:

原文:http://www.cnblogs.com/joeymary/p/9032825.html

相關文章
相關標籤/搜索