Dot-Net

Code-First Add-Migration 不斷添加相同的列

  • October 10, 2016

除其他外,我的模型包含在模型類初始創建和遷移後添加到模型類的兩個屬性。

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

目標數據庫包含PropertyOnePropertyTwo列,__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,並且不是人類可讀的。)導致問題的一系列步驟是:

  1. 對模型進行更改。
  2. 執行Add-Migration以創建更改的遷移。(這會創建隱藏IMigrationMetadata.Target值。)
  3. 注意到遷移建模的方式有錯誤,直接更改模型類和遷移類。(這些IMigrationMetadata.Target值現在不同步了。)
  4. 執行Update-Database以應用更改。

要擺脫混亂,請使用 創建一個虛擬遷移Add-Migration Dummy,然後從Up()Down()方法中刪除所有內容。

請注意,Add-Migration確實會警告您;當你執行時Add-Migration,它顯示:

此遷移文件的設計器程式碼包含目前 Code First 模型的快照。此快照用於在您建構下一次遷移時計算對模型的更改。如果您對要包含在此遷移中的模型進行其他更改,則可以通過再次執行“Add-Migration Dummy”來重新建構它。

在我弄清楚問題所在並看到隱藏的IMigrationMetadata.Target價值之前,警告沒有任何意義。

底線:不要手動保持模型和遷移Up()方法同步;您必須重新執行Add-Migration才能正確設置隱藏值。

引用自:https://stackoverflow.com/questions/25431549