【问题标题】:Entity Framework Code First and Connection Strings实体框架代码优先和连接字符串
【发布时间】:2011-11-23 22:26:03
【问题描述】:

我有一个使用 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

(通过附加'2'更改了Database=参数)

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

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

【问题讨论】:

  • 删除数据库后是否重启应用?
  • @StriplingWarrior:是的,我是。再次启动应用程序时出现错误。

标签: entity-framework-4 ef-code-first


【解决方案1】:

您不需要每次都使用唯一的数据库名称。首次创建模型时,它会运行 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。它通过创建派生类告诉您实际发生的情况以及如何在需要时为数据库播种。

【讨论】:

  • 为什么我在删除 .mdf 文件时收到“权限被拒绝”错误?如果不在已删除的 .mdf 文件中,EdmMetadata 表在哪里?
  • 我已经更新了关于如何删除 EdmMetadata 表的答案。我强烈建议您观看我链接的视频,它会告诉您您需要知道的一切。由于很多原因,您可能会收到“权限被拒绝”错误,其中一个是网络服务器仍在运行并访问该数据库。
  • 是的,我假设如果您删除了 .mdf 文件,那么应该删除数据库本身,包括 EdmMetadata 表。你是如何删除数据库的?通过 SQL Express 管理器?
  • 经过进一步检查,我发现您只是在删除文件而不是数据库本身。通过删除 .mdf 和 .ldf 文件,您只是删除了数据和日志文件。有关数据库及其文件位置的信息存储在 sql server 主数据库中,因此您还需要通过数据库资源管理器或 sql server/express management studio 从那里删除它。
  • 我在 SQL Server Management Studio 中没有看到任何提及“Journal”数据库的内容。我查看了对象资源管理器的数据库节点和 sys.Databases。
猜你喜欢
  • 1970-01-01
  • 2011-10-31
  • 2015-04-09
  • 1970-01-01
  • 2011-09-28
  • 2012-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多