2014-03-19 28 views
17

我剛從一個代碼優先的模型從實體框架6.0.2升級到6.1.0。將實體框架升級到6.1 - 索引已經存在錯誤

升級後,context.Database.CompatibleWithModel(true)返回false,因此EF認爲數據庫不再與模型兼容。我沒有改變任何東西,只是升級EF。

我跑Add-Migration,看看會發生什麼,EF創建一個大的遷移,似乎對每個表的每個外鍵屬性創建索引:

public override void Up() 
    { 
     CreateIndex("dbo.ActivityStreams", "UserId"); 
     CreateIndex("dbo.Users", "OfficeId"); 
     CreateIndex("dbo.Offices", "ParentId"); 
     CreateIndex("dbo.Rosters", "UserId"); 
     ...and many more similar lines... 

我想這是關係到新的索引EF 6.1的功能?有點奇怪,但確定。

當我Update-Database應用新遷移時,存在索引已存在的錯誤。查看數據庫和以前的遷移,幾乎所有的索引確實已經存在。

我在這裏做了什麼錯?是否有升級EF的程序?

+0

你自己創建了任何索引嗎? –

+0

不,所有現有的索引都是由EF遷移創建的。 –

+0

這裏的情況完全相同。確實存在一個錯誤 - ( – trailmax

回答

8

我有完全相同的問題。我通過重新創建索引來修復它。

我已經通過將DropIndexes從遷移中的Down方法複製粘貼到Up方法來實現此目的。 因此,首先刪除索引然後重新創建它們。 不知道爲什麼這是必要的,但它解決了這個問題。

+2

然後這聽起來像EF 6.1中的一個錯誤。你有報告嗎? –

+4

我現在有;-) https://entityframework.codeplex.com/workitem/2167 – UnreliableWitness

1

回覆:正在創建您的外鍵,我發現在以下鏈接如下信息:

的ForeignKeyIndexConvention代碼第一次會議造成的任何列創建索引:以下

http://blog.oneunicorn.com/2014/02/15/ef-6-1-creating-indexes-with-indexattribute/狀態外鍵,除非這些列已經有使用IndexAttribute指定的索引。如果你不希望你的FKS的索引,你可以刪除這個約定:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Conventions.Remove<ForeignKeyIndexConvention>(); 
} 
+0

謝謝!這解決了我的問題。我們一直在迭代系統並創建我們自己的索引,因爲EF的功能有限。我們使用nuget並更新了所有軟件包。一旦我們做了,由於新的ef,我們的遷移計劃失敗了。上面的這個選項使一切恢復正常! :) – Dave

11

正如在其他的答案中提到,這是由於實體框架的bug。將DropIndex代碼複製到Up方法所接受的答案導致數據庫不必要的工作。相反,我建議正確的做法是刪除UpDown方法的內容,因爲這些索引已經存在,不需要刪除。

+0

+1:這將創建一個空的虛擬任務,只會在EF6.1看到它時將模型模式的散列寫入遷移歷史記錄。 – null