4

我一直在使用,因爲實體框架代碼第一次成爲可用以下方法得到:指定的表格不存在。 [__MigrationHistory] ​​

public virtual void CreateDatabase() 
{ 
    var dbContext = _dbContextLocator.Current; 
    dbContext.Database.Delete(); 
    dbContext.Database.Create(); 
    dbContext.Database.Initialize(true); 
} 

最近,我注意到,當dbContext.Database.Create()被擊中,我得到以下異常:

發生System.Data.SqlServerCe.SqlCeException
消息=指定的表不存在。 [__MigrationHistory] ​​
源= SQL Server壓縮ADO.NET數據提供
錯誤碼= -2147467259
的HResult = -2147217865
NativeError = 0
堆棧跟蹤:在System.Data.SqlServerCe.SqlCeCommand.ProcessResults(的Int32小時)
的InnerException:

如果我去調試 - 例外,並勾選已投入「通用語言運行時例外」,這將導致停止執行,我也得到了上面的異常。如果我取消它,數據庫似乎得到正確創建的,但我得到了我的輸出窗口下面的錯誤陳述的四個重複:

型「System.Data.SqlServerCe.SqlCeException」的第一次機會異常發生在System.Data.SqlServerCe.dll中
在System.Data.SqlServerCe.dll中發生類型爲「System.Data.SqlServerCe.SqlCeException」的第一次機會異常
類型爲「System.Data.SqlServerCe.SqlCeException」的第一次機會異常'發生在System.Data.SqlServerCe.Entity.dll
在System.Data.Entity.dll
發生類型'System.Data.EntityCommandExecutionException'的第一次機會異常型「System.Data.EntityCommandExecutionException」的第一次機會異常出現在System.Data.Entity.dll
型「System.Data.EntityCommandExecutionException」的第一次機會異常出現在System.Data.Entity.dll

dbContext.Database.Create()周圍放置一個try/catch塊不起作用。

我的目標是創建一個完全空白的數據庫,然後手動填充數據。我不希望使用Entity Framework的新Migrations功能。

我能做些什麼來消除第一次機會異常?

+0

我注意到你正在使用精簡版 - 你是否檢查以確保DB有_MigrationHistory表?我確實看到它試圖刪除表,但即使它最近丟失了數據庫,您可能會遇到一些奇怪的事情 - 最近我記錄了我在_MigrationHistory表中消失的經歷。它也顯示了執行的SQL,以及我如何能夠得到它再次工作[在這篇文章上](http://stackoverflow.com/questions/11672812/code-first-migrations-and-initialization-error/11908847#11908847 ) – 2012-08-13 02:15:59

+0

我不太確定database.delete用CE做什麼,你可能想檢查它實際上是否工作,文件是否被刪除? – 2012-08-13 05:55:28

+0

@LukeMcGregor,很好的問題,但我只是檢查,它肯定會刪除數據庫。 – devuxer 2012-08-13 17:09:08

回答

5

我的目標是創建一個完全空白的數據庫

假設你的意思是與你的模型所需的實際模式對象的數據庫?

如果是這樣,你有兩個選擇:

1)忽略例外 - 隨着SQLCE,EF創建數據庫時使用的遷移管線內部。例外是Migrations如何確定__MigrationHistory表存在的實現細節。

2)使用傳統API - ObjectContext上的數據庫創建API使用傳統的非遷移代碼路徑。將您的DbContext轉換爲IObjectContextAdapter以獲取ObjectContext引用。

+0

謝謝你的回答,安德魯。 +1。你認爲這可以被認爲是實體框架中的錯誤嗎?看起來在創建新數據庫時不應該生成錯誤。 – devuxer 2012-08-13 17:23:23

+0

不,這只是我們如何確定歷史表的存在的一個有點不幸的副作用。正如你所觀察到的,我們正在捕捉和吞噬這些例外。 – 2012-08-13 18:31:44

+0

謝謝,這是有道理的。 – devuxer 2012-08-13 18:59:32