Code-First Add-Migration 不斷添加相同的列
除其他外,我的模型包含在模型類初始創建和遷移後添加到模型類的兩個屬性。
public sealed class SomeModel { ... other properties, which are fine. public int PropertyOne { get; set; } public int PropertyTwo { get; set; } }我最近的遷移包含:
public override void Up() { ... other table being created. AddColumn("dbo.SomeModel", "PropertyOne", c => c.Int(nullable: false)); AddColumn("dbo.SomeModel", "PropertyTwo", c => c.Int(nullable: false)); }目標數據庫包含
PropertyOne和PropertyTwo列,__MigrationHistory表包含創建表的遷移和添加列的遷移的條目。當我執行
Add-Migration以獲取其他一些更改時,它還再次包含這兩個屬性:public override void Up() { ... other changes. AddColumn("dbo.SomeModel", "PropertyOne", c => c.Int(nullable: false)); AddColumn("dbo.SomeModel", "PropertyTwo", c => c.Int(nullable: false)); }這可能是什麼原因造成的?我還注意到,如果我恢復所有模型更改並嘗試
Update-Database(應該什麼都不做),我會收到錯誤消息:無法更新數據庫以匹配目前模型,因為存在待處理的更改並且自動遷移已禁用。將掛起的模型更改寫入基於程式碼的遷移或啟用自動遷移。將 DbMigrationsConfiguration.AutomaticMigrationsEnabled 設置為 true 以啟用自動遷移。
這可能是什麼原因造成的?
事實證明,在
.designer.cs與遷移關聯的類中有一個隱藏的模型快照。(這是IMigrationMetadata.Target,並且不是人類可讀的。)導致問題的一系列步驟是:
- 對模型進行更改。
- 執行
Add-Migration以創建更改的遷移。(這會創建隱藏IMigrationMetadata.Target值。)- 注意到遷移建模的方式有錯誤,直接更改模型類和遷移類。(這些
IMigrationMetadata.Target值現在不同步了。)- 執行
Update-Database以應用更改。要擺脫混亂,請使用 創建一個虛擬遷移
Add-Migration Dummy,然後從Up()和Down()方法中刪除所有內容。請注意,
Add-Migration確實會警告您;當你執行時Add-Migration,它顯示:此遷移文件的設計器程式碼包含目前 Code First 模型的快照。此快照用於在您建構下一次遷移時計算對模型的更改。如果您對要包含在此遷移中的模型進行其他更改,則可以通過再次執行“Add-Migration Dummy”來重新建構它。
在我弄清楚問題所在並看到隱藏的
IMigrationMetadata.Target價值之前,警告沒有任何意義。底線:不要手動保持模型和遷移
Up()方法同步;您必須重新執行Add-Migration才能正確設置隱藏值。