2011-11-23 98 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