如何使用 Server Explorer 附加到由 Code First 创建的 MDF 文件

How does one Attach to an MDF file created by Code First using Server Explorer

给定: Code First 技术(全部正确完成并经过验证)。实际上,我可以在应用程序中看到从程序添加的记录。这意味着所有 SaveChanges 和后续查询都在工作。

问题: 我想将此数据库公开给另一个程序,但无法让服务器资源管理器数据连接附加到它...

你尝试了什么?

  1. 在 VS2013 中,我打开了服务器资源管理器,单击添加连接,然后 输入这个(在将 DataSource 更改为 SQLClient 而不是 默认数据库文件设置) : (LocalDb)\V11.0 然后点击 on "Selected or enter a database name" 显示的 tables 没有显示 新数据库 table。

  2. 然后我尝试输入完全限定名称 MYProject.MYDBContent 那没用。

  3. 然后我切换到"Attach a database file"的复选框并且 找到创建的文件。 (是的!)但是当试图 打开它说它无法打开,因为它是782版本,这个 服务器支持版本 706 及更早版本。后来,消息说 还有“存在同名的数据库,或者指定的文件不能 被打开,或者它位于 UNC 共享上。"

环境

我正在使用 VS2013 并使用 NUGET 下载 EF 6.0.2,但是当我 查看参考区中的 EF 告诉我它仍然是 Version 4.0....

我的系统同时安装了 SQL Server 2012 和 2014(本地数据库)。这一定是问题的根本原因。

想法?

Visual Studio 2013、EF 6.0.1 和 SQL Express 2012 在使用 Code First 时不能很好地协同工作。问题是生成了 MDF 文件,但任何使用服务器资源管理器数据连接进行连接的尝试都会失败,并显示上述 782 错误消息以及 SQL 2012 的 SSMS。即使您的系统没有 SQL 2014安装的MDF文件版以为是2014文件版!

如果您删除了一个 MDF 文件(就像我所做的以及随后所做的那样)尝试创建 MDF 失败(无法附加文件错误),那么只需重命名 DBContext class 名称,您将获得一个新的 MDF 文件!

环境:

Problem: I want to expose this DB to another program ...

我能描述 LocalDb 的最佳方式是作为 Sql 服务器实例的内存版本(可能类似于 Sql Express)。这意味着任何使用 LocalDb 连接到 Mdf/Ldf 的应用程序都将对该文件具有 独占 访问权限,但它不能被另一个实例使用。

如果您需要在多个应用程序之间共享数据,这就是 Sql Server Express 及更高版本的用途。

I'm using VS2013 and used NUGET to download EF 6.0.2, but when I look at EF in the references area is tells me it's still Version 4.0....

我不确定图片是否是您在撰写本文时看到的当前版本,但图片显示的是专为 .Net 运行时 4.0 设计的 6.0 运行 版本。这对我来说是正确的。

Visual Studio 2013, EF 6.0.1 and SQL Express 2012 do not work well together when using Code First.

我不知道你为什么要这样说。我已经毫无问题地编写了 3 个项目。 LocalDb 和Sql Server Express 是完全独立的两个产品,我感觉你没看懂。

如果您将 LocalDb 与 AttachDbFilename 一起使用,那么当您完成应用程序时 运行 database is dropped from the instance

摘录:

Use the AttachDBFilename connection string keyword to add a database to your LocalDB instance. When using AttachDBFilename, if you do not specify the name of the database with the Database connection string keyword, the database will be removed from the LocalDB instance when the application closes.

所以...

If you delete an MDF file (as I did and subsequent) attempts to create MDF fail (Cannot Attach File error).

这是因为在 Visual Studio 打开时缓存了连接。重命名 DbContext 会创建一个新连接并创建一个新的缓存版本。

I want to expose this DB to another program but cannot get Server Explorer Data Connections to attach to it..

任何版本 Sql 服务器(LocalDb、Express、Standard 等)都只能打开一个数据库。如果您想在 使用 Express 或更高版本的应用程序之间共享数据,则不能使用 LocalDb。

(LocalDb)\V11.0 and then clicked on "Selected or enter a database name" The tables shown did not show the new database table.

您可以使用此方法成功连接,因为它使用您安装的 2014 SQL Express LocalDB。为什么有些表没有显示可能与 how/when Code First 决定部署更新有关。我可能会坚持通过 localdb 连接并专注于调查该问题。

从服务器资源管理器附加 MDF 使用 SQL 服务器实例。 您没有为其安装 2014 实例。 2014 LocalDB 对此还不够。 看到这个问题,它强调了通过服务器资源管理器附加 MDF 需要 SQL Express 的实例: How to add SQL Server database file (.mdf) in Visual Studio without installing SQL Server Express Edition?

您的默认安装支持通过 localdb 连接。因此,如果您通过 localdb 连接,那么可以说 "work fine together"。如果要连接到 MDF 文件,则需要安装 2014 SQL Express 的服务器实例。

但是,如果我处在你的位置,我会坚持通过 localdb 连接,并探究为什么 "The tables shown did not show the new database table."

但是,如果您打算共享数据库,那么正如 Erik 指出的那样,localdb 将无法工作。您需要将连接指向 SQL 服务器的一个实例,并让代码优先 and/or 代码优先迁移在该实例中为您创建数据库。然后,您将连接到服务器实例,而不是通过 localdb 或 MDF 连接。

如果您将连接字符串指向 SQL 服务器实例,而不是使用 MDF 或 localdb 语法,那么 Code First 应该在您指向它的任何 SQL 服务器实例中创建数据库到。这意味着您指向的任何版本都将是它创建的版本。 IE。如果您的连接字符串指向 SQL Server 2012 Developer Edition 的实例,则数据库将是在该实例中创建的 2012 版本数据库。

Visual Studio 2013、EF 6.0.1 和 SQL Express 2012 在使用 Code First 时不能很好地协同工作。问题是 MDF 文件已生成,但使用服务器资源管理器数据连接进行连接的任何尝试都会失败,并显示上述 782 错误消息以及 SQL 2012 的 SSMS。即使您的系统没有有SQL2014安装的MDF文件版以为是2014文件版!

答案: 如果您删除了一个 MDF 文件(就像我所做的那样)并且随后尝试创建 MDF 失败并出现(无法附加文件错误),那么只需重命名 DBContext class 名称,您将获得一个新的 MDF 文件!