EF5:无法将文件“ {0}”作为数据库“ {1}”附加


140

我遇到了此处所述的确切问题(请参阅“无法附加到已删除的MDF文件”部分),但是在那里没有告诉您解决问题的方法...

简而言之,问题在于删除.mdf文件后,当我尝试使用EF 5.0访问数据库时会引发以下异常。

DataException-> EntityException-> SqlException:
无法将文件“ {0}”作为数据库“ {1}”附加

我确实删除了数据库文件,现在在运行应用程序时希望它使用其初始化程序时收到该讨厌的错误消息。有任何解决这个问题的方法吗?


1
抱歉,我没有提供具体答案,但是当时我没有100%可用的解决方案。我现在尝试通过不使用用户附加的数据库来避免该错误。通常,我可以通过连接SQL Server Management Studio并分离错误数据库来解决该错误。
OdeToCode 2012年

问题是数据库已不存在,因为我已经删除了物理文件。我实际上试图在其中一个工作室(集成于VS和外部)中照顾它。我的回答确实不是解决方案,而是一种解决方法,它只是告诉您不必坚持使用LocalDb。
Shimmy Weitzhandler 2012年

来自EF专家罗文·米勒(Rowan Miller)-请参阅romiller.com/2013/05/17/…我们希望在下一个VS版本中提供更好的解决方案。
RickAndMSFT

Answers:


220

如果删除该数据库文件,它仍然保持在SqlLocalDB的注册状态。有时它会修复它以删除数据库。您可以从命令行执行此操作。

  1. 在“开始/程序”菜单下,打开“ Visual Studio开发人员命令提示符”。
  2. 运行以下命令:

    sqllocaldb.exe stop v11.0

    sqllocaldb.exe delete v11.0


1
我没有找到Sql Server Object Explorer,因为我使用的是VS 2012 Express。因此,我无法尝试接受的答案。但是,您的回答对我非常有用。谢谢。
纽曼

3
你的回答救了我。我没有接受的答案中的(localdb)\ v11.0子节点,也无法从SQL Management Studio中删除引用,所以为您加油!
Santux

18
删除文件后,这对我有用。您也可以从工具->库软件包管理器->软件包管理器控制台运行命令。
Bart Verkoeijen 2013年

11
作为附带说明,v11.0特定于SQL LocalDB2012。如果使用的是LocalDB 2014,MS会将其重命名为MSSqlLocalDb
CodingWithSpike 2014年

4
关于上述注释,您也不能输入任何数据库名称,它仅适用于默认数据库名称,我在下面将其与vs2015一起使用,它可以正常工作:sqllocaldb.exe stop sqllocaldb.exe delete
Deviney 2015年

147

对于那些仍在寻找解决方案的人...

转到“查看/ SQL Server对象资源管理器”,然后从(localdb)\ v11.0子节点中删除数据库!
在此处输入图片说明

本质上是保留了应保存文件位置的本地数据库,如果要删除数据库文件,请确保将其从此资源管理器实用程序中删除,而不是手动删除。


这一次使我
难过

8
另外,如果您看不到它。只需添加一个新连接,然后输入“(localdb)\ v11.0”(使用Windows Auth)。看起来似乎很简单,但是我在那里盯着屏幕看了一会儿。:)
彼得

@Peter Ok,添加了数据库,现在我看到了2个上下文。当我从该视图中删除时,出现一个新错误:“无法检索该数据库的数据访问级别”。我可以通过使用命令提示符来解决此问题。
nVentimiglia 2014年

1
使用EF6的默认连接工厂时,您可能使用的是mssqllocaldb。将服务器更改为(LocalDb)\ mssqllocaldb,然后查看服务器是否连接。有多种版本的LocalDb,但其中一个版本无法完整显示。
Jim Yarbro

另外,我的经验是:单击断开连接,如果再也看不到数据库,请再次连接。(刷新无济于事)
StefanG 2015年

19

我确实首先尝试了JSobell的解决方案,但没有在其中列出我的数据库。我从VS Developer Command Prompt运行了CodingWithSpike的命令,但是那也不起作用。最后,我从Package Manager控制台运行了CodingWithSpike的相同命令,并且该命令有效。

    PM> sqllocaldb.exe stop v11.0
    LocalDB instance "v11.0" stopped.

    PM> 
    PM> sqllocaldb.exe delete v11.0
    LocalDB instance "v11.0" deleted.

    PM> sqllocaldb.exe start v11.0
    LocalDB instance "v11.0" started.

9

好的。

我的解决方案很简单,我更改为使用本地服务器:

DataSource将连接字符串中的属性更改为:

Data Source=(LocalDb)\v11.0;blah

至:

Data Source=.\SQLEXPRESS;blah

另一个解决方案是通过SQL Management Studio登录到LocalDb,然后尝试删除该数据库:

在此处输入图片说明

但是,它对我不起作用,当我尝试将其删除时,它显示“标题:Microsoft SQL Server Management Studio

服务器上不存在数据库“ {0}”。(SqlManagerUI)

当我尝试分离它时,数据库没有出现在分离选择列表中,“脱机”也将我带到上面的错误。

这使我认为这是LocalDB中的可靠错误。


我在尝试将本地数据库与EF5结合使用时遇到问题
Nikos

与IIS Express一样,LocalDB的好处是您可以在本地帐户下运行它,而无需管理员特权。这允许与许多开发人员共享项目,而无需为每个用户设置IIS或SQL Server。
Bart Verkoeijen


2

最好,最简单的答案就是我现在解决了,只需使用ur sql服务器名称作为数据源,初始目录就是您的数据库名称,然后删除mdf行


1

在我的情况下,我使用迁移,在配置中,我只是更改了dataContext和dataContext类本身的名称(只是重命名),然后再试一次,这对


1

对于SQL 2014,请遵循CodingWithSpike选择的答案和此注​​释

作为附带说明,v11.0特定于SQL LocalDB2012。如果您使用的是LocalDB 2014,则MS会将其重命名为MSSqlLocalDb。– CodingWithSpike 2014年8月29日在19:20


有用侧面说明,我遇到一个老项目,2015年VS这个工作更多信息。也有在VS 2013类似的变化v11.0ProjectsV12 。至少在我的机器上:-)。
瞄准

0

我遇到了同样的问题,我通过将“ DataDirectory”文件夹手动设置为应用程序二进制文件中的另一个文件夹来解决了该问题。

我将此行放在Global.asax Application_Start方法中:

AppDomain.CurrentDomain.SetData("DataDirectory", Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Data"));

我的连接字符串当前设置为:

<connectionStrings>
    <add name="DataContext" connectionString="Data Source=(LocalDb)\v11.0; Initial Catalog=DataContext; Integrated Security=True; MultipleActiveResultSets=True; AttachDbFilename=|DataDirectory|DataContext.mdf"
  providerName="System.Data.SqlClient" />


我没有对其进行测试,但这可能不起作用。因为默认情况下DataDirectory已经设置为本地App_Data,所以除非之前进行了明确更改,否则您的代码将不执行任何操作。
Shimmy Weitzhandler

如果采用这种方法,请不要更改目录,而要更改MDF文件名。还请参见romiller.com/2013/05/17/…–
RickAndMSFT


0

使用Sql Server Management Studio连接到(LocalDb)\ v11.0,删除数据库,然后在程序包管理器控制台中执行更新数据库。


0

我有同样的问题。我在程序包管理器控制台中运行了以下命令,它解决了该问题

sqllocaldb.exe stop MSSqlLocalDb

sqllocaldb.exe delete MSSqlLocalDb
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.