2011-11-23 101 views
6

我使用實體框架代碼第一次小MVC 3應用,並使用此連接字符串的模式:實體框架代碼優先和連接字符串

data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|Journal.mdf;User Instance=true;Database=MyJournal 

當我做一個模型更改(例如添加財產),我得到如預期

自創建數據庫以來,支持'JournalContext'上下文的模型已更改。

因此,在開發模式下,我會繼續並刪除Journal.mdf和Journal.ldf。

現在,當我再次運行應用程序,我得到

無法打開數據庫「MyJournal」由登錄請求。登錄 失敗。

如果我改變我的連接字符串

data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|Journal.mdf;User Instance=true;Database=MyJournal2 

Journal.mdf創建(通過附加 '2',改變了Database=參數)和應用程序再次工作。如果我進行了一些更改並嘗試再次「回收」任何數據庫名稱,則出現「無法打開」錯誤。

爲什麼每次更改模型時都需要提供一個唯一的數據庫名稱,以及如何「清除」以前的名稱?

+0

刪除數據庫後是否重新啓動應用程序? – StriplingWarrior

+0

@StriplingWarrior:是的,我是。我再次啓動應用程序時遇到錯誤。 –

回答

6

您每次都不需要唯一的數據庫名稱。當模型首次創建時,它會運行DatabaseInitializer來執行創建數據庫(如果數據庫不存在或添加種子數據)。默認的DatabaseInitializer嘗試將使用模型所需的數據庫模式與存儲在使用數據庫創建的EdmMetadata表中的模式的散列(比如Code First創建數據庫時)進行比較。如果散列比較不同,則會引發該錯誤。

顯然,如果您更改連接字符串,那麼它將創建一個名爲'MyJournal2'的全新數據庫。

解決此問題的方法是刪除EdmMetadata表並再次運行初始化程序。你可以進入Visual Studio的數據庫瀏覽器窗口並連接到你的數據庫,然後進入你要找到EdmMetadata表格的表格,右鍵點擊它並選擇刪除。

或者把

DbDatabase.SetInitializer(new DropCreateDatabaseIfModelChanges<dbType>()); 

在Global.asax.cs中的Application_Start方法。這將刪除數據庫並在架構更改時重新創建它。

有關更多詳細信息,請參見this video on pluralsight,尤其是「」級別更改爲時。

另請查看此鏈接DropCreateDatabaseIfModelChanges。它會告訴您實際發生了什麼,以及如何通過創建派生類來創建數據庫。

+0

當我刪除.mdf文件時,爲什麼會收到「權限被拒絕」錯誤? EdmMetadata表在不存在於刪除的.mdf文件中的情況下在哪裏? –

+0

我已經更新了我的答案,關於如何刪除EdmMetadata表。我強烈建議你觀看我鏈接的視頻,它告訴你你需要知道的一切。出於許多原因,您可能會收到「權限被拒絕」錯誤,其中一個原因是Web服務器仍在運行並訪問該數據庫。 – link664

+0

是的,我會假設如果你刪除.mdf文件,那麼數據庫本身應該被刪除,包括EdmMetadata表。你如何刪除數據庫?通過SQL Express管理器? – link664