2014-09-10 52 views
0

我有一個剛剛開始使用EF遷移的項目。定位遷移源

存在初始遷移和額外的手動編輯遷移,該遷移定義了索引視圖。沒有其他遷移。

我最近添加了一個屬性到一個類。當我創建一個新的模式時,該屬性被創建。但是,我不明白爲什麼會創建它,因爲在任何遷移中都沒有提及該屬性。

如果我搜索整個源代碼文件夾(包含子文件夾,)以提供該屬性名稱,它不會出現在任何EF遷移代碼中(它只出現在定義它的類中,並且在訪問該屬性的幾行代碼中)。

當我在兩個現有遷移的Up()方法的開始和結束處設置斷點時,我可以看到,通過初始遷移(在SSMS中驗證)創建的表沒有附加屬性,而且該屬性在最後一次Up()遷移結束時還不存在。在控制離開上次遷移後的某個時間,某些代碼會在數據庫中爲此其他屬性創建一個列。

要嘗試跟蹤這一點,我將這個新屬性手動編輯到初始遷移中。現在,在上次遷移的Up()方法退出後,我得到一個SqlException

每個表中的列名必須是唯一的。表'dbo.MyTable'中的列名'MyNewProperty'被多次指定。

在我的DbContext的構造函數中。

堆棧跟蹤僅顯示實例化DbContext的代碼。

如何追蹤此額外遷移的來源?

+0

是否啓用自動遷移?在'Migrations'文件夾中,你應該有一個'Configuration'類,看看'AutomaticMigrationsEnabled'的構造函數。 – Lukazoid 2014-09-10 19:59:43

+0

@Lukazoid:是的,自動遷移已啓用。 – 2014-09-10 20:08:24

+0

那麼這將是新列的來源,自動遷移意味着Entity Framework將自動將您的域實體上的任何新屬性映射到SQL列。 – Lukazoid 2014-09-10 20:11:32

回答

1

如果您未爲此新屬性明確添加基於代碼的遷移(使用添加遷移),但正在創建列,則可確定automatic migrations已啓用。

自動遷移允許實體框架自動確定表示對域模型所做的任何更改所需的模式更改,這就是添加新列的原因。

您還在想,爲什麼即使在您手動編輯基於代碼的遷移以添加此新列後仍會嘗試添加新列,對於每個基於代碼的遷移,都會生成一個包含string IMigrationMetadata.Target屬性的生成代碼隱藏文件(.Designer.cs),這將返回字段快照,說明應用此遷移後域模型的外觀。

當您手動編輯遷移文件時,此Target屬性仍返回該域的舊字符串表示形式,該表示形式不包含您的新屬性;作爲此的結果,自動遷移然後嘗試添加重複的列。

解決方法是將新屬性添加到域,然後使用add-migration命令爲此新屬性添加新的基於代碼的遷移。

+0

謝謝,這是有道理的。 – 2014-09-10 20:51:53