EF Core Model更新遷移

2022-02-07 05:56:47 字數 2724 閱讀 2685

在.net 開發中,如你的專案中使用ef進行資料管理,當需要新增、修改ef model結構時,怎樣才能自動化的更新db中的真實table。以及對這些更改進行乙個版本控制。

下面我將使用乙個asp.net core的web應用程式,來演示該操作:

假設現在我們要在model/student.cs 加乙個屬性

public string newcolfortest
新的模型變為:

對應的table,我們希望變成如下

操作步驟:

編輯*.csproj 檔案,新增highlight內容

cmd 定位到專案根目錄並執行以下語句

dotnet ef migrations add initialcreate
將初始化ef core用於遷移的檔案。initialcreate是其中乙個遷移記錄的版本檔名,暫不關心。

現在你的專案中將多出:

【schoolcontext】modelsnapshot裡面記錄了要生成db的內容。

20180513071210_【initialcreate】記錄了此次更新(同上個版本)的部分,由於我們是第一次初始化,所以裡面記錄了全部表結構內容。

【schoolcontext】modelsnapshot:

partial class schoolcontextmodelsnapshot : modelsnapshot

);...}}

20180513071210_【initialcreate】:

public partial class initialcreate : migration

,constraints: table =>

);...

}protected override void down(migrationbuilder migrationbuilder)

}

回到cmd 定位到專案根目錄執行

dotnet ef database update
ef core將為我們跟db同步

現在我們的db應該跟model是一致的(多餘的細節,這裡就不贅述了)

做到這裡,我們應該清楚ef core是通過生成/migrations folder的內容來實現同步db。

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

ef core 使用 __migrationshistory 表檢視是否需要執行任何遷移。 如果 db 已是最新,則無需執行遷移。

現在開始更改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 down(migrationbuilder migrationbuilder)

}

最後執行

檢視db

原有的資料也仍在。完成。

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

總結:我覺得很大乙個亮點是每次更新都生成乙個追蹤版本,某些情況下,省去了單獨維護sql 指令碼的工作。

與ef code first比較,執行的更加「透明」,讓我們更直接的知道發生了什麼

專案遷移oracle到mysql 持續更新

專案從oracle遷移到mysql,很有很多問題。總結一下目前遇到的問題。1 配置mysql資料來源,引用mysql驅動,這個是必須的。2 生成表,一些資料型別的變化,比如在oracle的日期型別是datetime,在mysql用date。3 oracle樹結構查詢 select start wit...

git倉庫遷移和更新遠端倉庫位址

git倉庫遷移和更新遠端倉庫位址 一 git倉庫遷移 1,從原倉庫clone或pull到本地倉庫 git clone project name old remote repository address 2,在新的git建立乙個新倉庫。如果用gitolite搭建的git伺服器,那麼只需要在配置檔案g...

git倉庫遷移和更新遠端倉庫位址

一 git倉庫遷移 1,從原倉庫clone或pull到本地倉庫 git clone project name old remote repository address 2,在新的git建立乙個新倉庫。如果用gitolite搭建的git伺服器,那麼只需要在配置檔案gitolite.conf上新增倉庫...