无法将*.mdf文件作为数据库附加

80

基本上我遵循了一个教程,之后决定删除.mdf文件。

现在每当我尝试运行应用程序时,都会收到以下错误(这个帖子的标题)。 下面是我收到错误的代码(ASP.NET MVC 4):

OdeToFoodDB db = new OdeToFoodDB();

public ActionResult Index()
{
    var model = db.Restaurants.ToList();
    return View(model);
}

我的连接字符串如下:

<add name="DefaultConnection" 
     connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=OdeToFoodDb;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\OdeToFoodDb.mdf" 
     providerName="System.Data.SqlClient" />

我尝试查看 SQL Server 对象浏览器,但它看起来是这样的:

而且,在服务器资源管理器中,我没有看到任何数据连接。

当我尝试在服务器资源管理器中添加新连接时,我没有看到名为 OdeToFoodDb 的数据库。

对不起,我的问题比较广泛,但我是 Entity Framework 的新手,不太明白出了什么问题。


4
你说你删除了 .mdf 文件,那是 SQL Server 数据库文件。如果你已经删除了它,就没有数据库了,因此会出现错误。 - STLDev
想和 @STLDeveloper 说一样的话,如果代码找不到所需的数据库,该怎么继续执行呢? - Owais Qureshi
编译后,您的 MVC 项目的 bin\Debug\App_Data 文件夹中是否有 OdeToFooDb.mdf 文件? - rene
2
没有任何mdf文件。我如何生成一个mdf文件? - John Mayer
1
完全没有mdf文件。 我尝试重命名dbcontext类,现在它可以工作了。可能是什么原因导致的? - John Mayer
显示剩余4条评论
22个回答

131

我认为对于SQL Server Local Db,你不应该使用Initial Catalog属性。 我建议使用:

<add name="DefaultConnection" 
     connectionString="Data Source=(LocalDb)\v11.0;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\OdeToFoodDb.mdf" 
     providerName="System.Data.SqlClient" />

我认为本地数据库不支持在同一个mdf文件上运行多个数据库,因此指定初始目录是不被支持的(或者支持得不够好,我遇到了一些奇怪的错误)。


18
将连接字符串中的"Initial Catalog"部分移除后,问题得到了解决。 - Tim Friesen
2
所有其他建议都过度了。 这个方案简单、简洁且有效。 - Jammer
1
这与真正的问题无关。当然,您可以指定目录名称。 - Xan-Kun Clark-Davis
8
这是解决问题的实际答案,或者至少是对这个 bug 更好的解决方法。官方回答此问题是错误的。 - Nathan McKaskle
2
换句话说,对于localdb,您需要用“AttachDBFilename = ...”替换“initial catalog = ...”,否则在尝试打开连接时会出现随机的SqlExceptions。 - seguso
显示剩余3条评论

61
请看这个链接:Entity Framework 不创建数据库 引用如下:
我建议尝试使用不同的数据库名称。有时,使用 SQL Express 创建一个已经存在的数据库名称会遇到问题。虽然可以使用 SQL Server Management Studio 来解决这个问题,但通常更容易只使用不同的数据库名称。 编辑:本答案被接受是因为它证实了bug,并确认了 OP 使用的解决方法(重命名数据库可能有所帮助)。我完全同意重命名数据库并不是一个可接受的方式,也不能完全解决问题。不幸的是,我没有检查其他在 SSMS 中真正解决此问题的方法。

3
我很想知道如何使用SSMS来解决这个问题,因为我也遇到了同样的问题,而且我希望保持数据库名称不变。 - julealgon
@julealgon,这个过程在这里有解释。 - Bogac
3
不需要这么做,只需从 Visual Studio SQL Server Object Explorer 视图中删除数据库(并关闭连接)。 - Sebastián Rojas
我认为这不是一个好的方式,对于生产系统来说绝对不能使用。 - Xan-Kun Clark-Davis
我认为https://stackoverflow.com/questions/15403469/how-can-i-install-the-northwind-database-into-sql-server-local-db/15415154#15415154 是更好的解释你需要做什么。 - Matt Vukomanovic
显示剩余4条评论

37
  1. 从程序包管理器控制台运行:

    sqllocaldb.exe stop v11.0

    sqllocaldb.exe delete v11.0

  2. 运行您的项目。

  3. 注册用户。

在 web.config 的连接字符串中,将 v11.0 替换为 MSSQLLocalDB,如下所示:data source=(LocalDb)\MSSQLLocalDB;... - Zoha
不要忘记使用 sqllocaldb.exe start v11.0 启动服务器。 - Shriram Panchal

16

从连接字符串中移除这行代码即可实现: "AttachDbFilename=|DataDirectory|whateverurdatabasenameis-xxxxxxxxxx.mdf"

注意: 不要删除其他有效的连接信息。


我也试过了,这可能就是答案。 - Matt West
12
等等,什么?你是想指定一个数据库文件吗?那么你就必须要加上这行代码,否则就不需要。如果不是这个问题,那这行代码就没有任何意义。 - Xan-Kun Clark-Davis

7

当您遇到如上错误信息时,请执行以下步骤:

  1. 打开 SQL Server 对象资源管理器
  2. 点击刷新按钮
  3. 展开 (localdb)\MSSQLLocalDB(SQL Server 12.x.xxxxx - xxxxx\xxxx)
  4. 展开数据库
  5. 请删除已存在的同名数据库
  6. 右键单击并选择删除
  7. 返回 Package Manage Console
  8. 执行 Update-Database 命令

无法将文件 'C:\Github\TestService\TestService\App_data\TestService.mdf' 附加为名为 'TestService' 的数据库。


4

我曾经遇到过同样的问题。 以下是在VS 2013中解决该问题的步骤:

  1. 在服务器资源管理器中添加新的“连接到数据库”
  2. 选择Microsoft SQL Server数据库文件作为数据源
  3. 根据web.config中的连接字符串选择数据库文件名
  4. 新的数据库文件被创建,并且在服务器资源管理器中出现了两个数据库连接:“MyDatabaseName”和“MyDatabaseName(MyProjectName)”
  5. 删除一个连接(我删除了“MyDatabaseName”)

听起来好像您曾经通过资源管理器删除了mdf文件,而不是使用**Database.Delete();**命令。 - Xan-Kun Clark-Davis

3

使用SQL SERVER Management Studio解决此问题

问题:您会遇到如下错误:'Cannot attach the file 'YourDB.mdf' as database 'YourConnStringNamedContext'。

原因:出现此问题是因为您没有在SqlLocalDb的运行实例中删除数据库,而是删除了支持文件 .mdf 和 .ldf。重新在VS中运行代码不会有帮助,因为您不能创建相同名称的数据库(这就是重命名可以起作用但旧的虚幻数据库名称仍然存在的原因)。

解决方案:我正在使用VS2012,其他版本类似操作。

进入以下路径并输入:

c:\program files\microsoft sql server\110\Tools\Binn>sqllocaldb info

以上命令将显示实例名称,包括 'v11.0'

如果实例已在运行,请在提示符处输入以下内容:

sqllocaldb info v11.0

请注意以下信息:所有者: YourPCName\Username ,状态: 运行中,实例管道名称: np:\.\pipe\LOCALDB#12345678\tsql\query ,其中 123456789 是一些随机字母数字。

如果状态不是运行或停止,请使用以下命令启动该实例:

sqllocaldb start v11.0

并提取上述相同的信息。

在 SS Management Studio 的 '连接' 对话框中输入:

服务器名称: np:\.\pipe\LOCALDB#12345678\tsql\query

认证方式: Windows auth

用户名: (与所有者相同,对于 Win. 认证而言其是灰色不可编辑的)

一旦连接成功,请查找您删除的虚幻数据库(例如 YourDB.mdf 应创建名为 YourDB 的数据库)并真正删除它。

完成!一旦它被删除,VS EF 就可以轻松地重新创建它。


2
您已经在服务器资源管理器中安装了该数据库的旧版本。因此,在服务器对象资源管理器/SQL服务器中出现了一个简单的命名冲突。您可能在将其移动到Apps_Data文件夹之前已经创建了相同的数据库目录名称。因此,该数据库名称已经存在,只需要删除它即可。
只需进入Visual Studio >视图> SQL Server对象资源管理器,删除旧的数据库名称及其连接。再次尝试运行应用程序,它应该会在App_Data中安装.mdf文件并在服务器资源管理器中创建完全相同的数据库。

1
这是正确的答案,因为它实际上解决了核心问题。另一个答案只提供了解决方法。 - Nick Fleetwood
没错,这个回答和@YTKim的回答是正确的——其他所有回答仍然让旧的数据库引用留在LocalDB配置中,并且不会两次修复相同的问题。 - Samuel Jaeschke

2
遇到了这个问题。在我的情况下,是因为当iisexpress仍在运行并仍在使用数据库时删除了.mdf文件所导致的。 右键单击系统托盘中的iisexpress,然后单击退出,然后再删除MDF文件,以防止实际发生此错误。
要解决此错误,只需在VS中右键单击App-Data文件夹,添加新项> SQL Server数据库。名称:[使用update-database错误提供的数据库名称] 点击添加。

谢谢,这是正确的答案。 - Zhar

1
根据@davide-icardi的建议,从web.config中删除“Initial Catalog=xxx;”,同时检查您的Azure发布配置文件,将其从以下位置中删除:
[YourAspNetProject path]\Properties\PublishProfiles[YourAspNetProjectName].pubxml
<PublishDatabaseSettings>
  <Objects xmlns="">
    <ObjectGroup Name="YourAspNetProjectName" Order="1" Enabled="True">
      <Destination Path="Data Source=AzureDataBaseServer;Initial Catalog=azureDatabase_db;User ID=AzureUser_db_sa@AzureDataBaseServer;Password=test" />
      <Object Type="DbCodeFirst">
        <Source Path="DBMigration" DbContext="YourAspNetProjectName.Models.ApplicationDbContext, YourAspNetProjectName" MigrationConfiguration="YourAspNetProjectName.Migrations.Configuration, YourAspNetProjectName" Origin="Configuration" />
      </Object>
    </ObjectGroup>
  </Objects>
</PublishDatabaseSettings>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接