日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

EF Core Model更新迁移

發(fā)布時間:2025/3/20 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 EF Core Model更新迁移 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

EF Core 遷移

感覺就是以前EF Code First的自動同步數(shù)據(jù)庫功能

內(nèi)容:在你新增、更新TableModel后,如何自動化的更新DB中的真實Table。以及對這些更改進(jìn)行一個版本控制。

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

當(dāng)下我們已經(jīng)有了一個ASP.NET Core的web應(yīng)用程序,本文我們所關(guān)心的只有2個:
1、Model
2、DB Table

當(dāng)下:

Model

最后一個為導(dǎo)航屬性,無視。

Table

現(xiàn)在我們要在Model/Student.cs 加一個屬性

public string NewColForTest { get; set; } 更改后

對應(yīng)的Table,我們希望變成如下

如何操作呢?

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

優(yōu)點(diǎn)

  • 不需要去手動操作數(shù)據(jù)庫
  • 不會影響現(xiàn)有db data(也就是不是重建db)
  • 可追溯更改內(nèi)容,即版本控制

開始動手

前期準(zhǔn)備

建一個ASP.NET Core web Application,用EF Core連接好數(shù)據(jù)庫,建好Student.cs

編輯*.csproj 文件,添加highlight內(nèi)容

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

dotnet ef migrations add InitialCreate

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

現(xiàn)在你的項目中將多出:

【SchoolContext】ModelSnapshot里面記錄了要生成db的內(nèi)容。

20180513071210_【InitialCreate】記錄了此次更新(同上個版本)的部分,由于我們是第一次初始化,所以里面記錄了全部表結(jié)構(gòu)內(nèi)容。

【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同步

現(xiàn)在我們的db應(yīng)該跟Model是一致的(多余的細(xì)節(jié),這里就不贅述了)

做到這里,我們應(yīng)該清楚EF Core是通過生成/Migrations Folder的內(nèi)容來實現(xiàn)同步db。

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

EF Core 使用 __MigrationsHistory 表查看是否需要運(yùn)行任何遷移。 如果 DB 已是最新,則無需運(yùn)行遷移。

Now

更改Student.cs

添加新屬性NewColForTest

按照我們的猜測,要同步更新db,應(yīng)該就是更改/Migrations Folder里的內(nèi)容。把該屬性對應(yīng)的添加上去,然后執(zhí)行

dotnet ef database update

即可實現(xiàn)同步更新(遷移)。

現(xiàn)在這里可以手動更改/Migrations Folder里的兩個文件,然后執(zhí)行cmd。

那么可以不手動嗎?

可以,先執(zhí)行命令,生成一個新的差異版本Migration,我們命名為UpdateStudent

dotnet ef migrations add UpdateStudent

結(jié)果

點(diǎn)開文件

只有差異內(nèi)容。

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");}}

最后執(zhí)行

dotnet ef database update

查看我們的db

原有的數(shù)據(jù)也仍在。完成。

注意:如果命令報錯,可以檢查是否把iis express退出。

總結(jié)

我覺得很大一個亮點(diǎn)是每次更新都生成一個追蹤版本,某些情況下,省去了單獨(dú)維護(hù)sql 腳本的工作。

與EF Code First比較,運(yùn)行的更加“透明”,讓我們更直接的知道發(fā)生了什么,黑魔法的感覺少了很多。Code First更新在配置完成下只需要運(yùn)行F5,即DB 同步成功,讓人感覺不是那么“親近”。

認(rèn)識較淺,請指教。

Thanks All.

歡迎討論~
感謝閱讀~

個人公眾號:

原文:https://segmentfault.com/a/11...

總結(jié)

以上是生活随笔為你收集整理的EF Core Model更新迁移的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。