感受就是之前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提供的一種遷移。
前期準備
建一個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.
歡迎討論~
感謝閱讀~
我的公衆號: