一、數據庫架構的管理
1.EF Core提供兩種方式來保持EF Core的模型與數據庫保持同步。
(1)以數據庫為準:反向工程(Db First),適用于中大型工程
(2)以代碼為準:數據遷移(Code First),適用于小型工程
2.關于Nuget包:Microsoft.EntityFrameworkCore.Design:常用于反向工程 Tools:數據遷移
3.遷移方式:
(1)當引入的數據模型更改時,添加遷移操作時,EF Core將當前模型與舊模型的快照進行比較,確定差異并生成遷移源文件
注意:主要是比較模型類與模型配置類(IEntityTypeConfiguration接口實現類以及DbContext類)修改前后的差異(修改前的代碼保存在快照當中),然后生成對應的遷移腳本
(2)生成新的遷移后,遷移的記錄將保存在Migration文件夾中。EF也將在數據庫中記錄所有的遷移變化
二、深入研究Migrations中的兩個方法
1.獲取Migrations腳本:新建實體類與配置類,以及DbContext,然后執行數據庫遷移指令,觀察生成的數據庫腳本:
實體模型:
配置類:
數據庫上下文類:
執行數據庫遷移指令:
生成的Migration腳本如下:
2.引入概念:
(1)向上遷移、向下遷移:使用遷移腳本,可以對當前連接的數據庫執行編號更高的遷移,這個操作叫做向上遷移(Up),也可以執行將數據庫回退到舊的遷移,這個操作稱為“向下遷移”。
(2)注:除非有特殊需要,否則不要刪除Migrations文件夾下的代碼(回退數據庫版本使用)
3.代碼分析:
(1)根目錄下的文件
(2)Intial.cs的Up與Down方法:
Up:生成這張表或執行更新操作所需要的代碼腳本
Down:回退當前操作所需要執行的代碼
若在實體中添加一個屬性Height,同樣執行數據庫遷移命令,生成的腳本如下:
注意,在生成的數據庫中會有一張表,用于記錄Migration記錄,若隨意刪除則會報錯。
4.但是Migration文件夾中的文件也不是一定不能刪除。一般情況下只需要將生成的數據庫整個刪除以后,再刪掉Migrations文件夾即可。此時重新運行Add-Migration命令以及update-database就不會出現任何問題。(因為快照等都被刪除了,等于重新開始建庫)
三、其他的Migration遷移指令
1.Update-Database XXX:將數據庫回滾到XXX的狀態,遷移腳本不動
將數據庫回滾到Initial狀態
2.刪除最后一次的遷移腳本:Remove-Migration
3.Script-Migration:生成遷移Sql代碼。Update-Database可以更新數據庫,執行該命令可以生成SQL的更新腳本,手動更新數據庫,有利于DBA對數據庫進行管理以及恢復。
五、重置遷移
1.若需要重置所有遷移,但是又需要保留測試數據,可以按照以下方法操作:
(1)刪除Migrations文件夾
(2)刪除對應數據庫中__EFMigrationsHistory表中的數據(不是刪除表,只是清除數據)
(3)創建新的遷移并為其生成SQL腳本
(4)在數據庫的遷移記錄表(__EFMigrationsHistory)中插入一行,以記錄剛才的遷移已經應用
2.示例:
(1)刪除Migrations文件夾,重新執行Migration:
(2)刪除數據庫中的__EFMigrationHistory表中的數據
(3)將遷移的腳本所產生的數據直接插進遷移記錄表中:(相當于手動執行update-database)
(4)修改一下代碼,重新應用遷移:將People表的Name屬性的最大長度由50改為64:
查看數據庫:
且其他表的數據都沒有受到影響。