实体框架代码优先和连接字符串

2024-03-29

我有一个使用 Entity Framework Code First 的小型 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

(改变了Database=参数通过附加“2”)

Journal.mdf 已创建,应用程序再次运行。如果我进行了一些更改并尝试再次“回收”任何数据库名称,我会收到“无法打开”错误。

为什么每次更改模型时都需要提供唯一的数据库名称,以及如何“清除”以前的名称?


您不需要每次都使用唯一的数据库名称。首次创建模型时,它会运行 DatabaseInitializer 来执行诸如创建数据库(如果数据库不存在)或添加种子数据之类的操作。默认的 DatabaseInitializer 尝试将使用模型所需的数据库模式与存储在使用数据库创建的 EdmMetadata 表中的模式哈希进行比较(当 Code First 是创建数据库的时候)。如果哈希比较不同,则会抛出该错误。

显然,如果您更改连接字符串,那么它将创建一个名为“MyJournal2”的全新数据库。

解决此问题的方法是删除 EdmMetadata 表并再次运行初始化程序。为此,您可以进入 Visual Studio 中的数据库资源管理器窗口并连接到数据库,然后转到应在其中找到 EdmMetadata 表的表,右键单击它并选择删除。

或者放

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

in your Application_StartGlobal.asax.cs 中的方法。这将删除数据库并在架构更改时重新创建它。

See 有关更多详细信息,尤其是“当班级发生变化时'.

另请检查此链接如果模型更改则删除创建数据库 http://msdn.microsoft.com/en-us/library/gg679604%28v=VS.103%29.aspx。它告诉您实际发生的情况以及如何通过创建派生类来为数据库提供种子(如果需要)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实体框架代码优先和连接字符串 的相关文章

随机推荐