在.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 : modelsnapshot20180513071210_【initialcreate】:);...}}
public partial class initialcreate : migration回到cmd 定位到專案根目錄執行,constraints: table =>
);...
}protected override void down(migrationbuilder migrationbuilder)
}
dotnet ef database updateef 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上新增倉庫...