因为文件“*.mdf”已经存在,所以无法创建该文件。

6
我正在一个Winforms应用程序中使用Entity-Framework。该应用程序连接到MSSQLServer,一切正常。然后我分离了数据库并将.mdf文件复制到应用程序文件夹,并更改连接字符串以使用本地.mdf文件,仍然一切正常。
问题是,当我将我的应用程序和数据库一起复制到另一台计算机时,EF突然尝试重新创建数据库,并抛出以下错误:
“无法创建文件'Path\MyDatabaseName.mdf',因为它已经存在。更改文件路径或文件名,并重试操作。CREATE DATABASE失败。列出的一些文件名无法创建。检查相关错误。”
上下文初始化器设置为MigrateDatabaseToLatestVersion:
Database.SetInitializer<MyContext>(new MigrateDatabaseToLatestVersion<MyContext, DAL.Migrations.Configuration>("MyConnectionString"));

另外,自动迁移已关闭,数据库由EF Code-First在Sql-server上创建,并已更新到最新迁移,因此不需要迁移。

第一个情景的连接字符串为:

<add name="MyConnectionString" connectionString="Server=DESKTOP-XXXXXXX; Database=MyDatabase; Integrated Security=True; Connect Timeout=30;" providerName="System.Data.SqlClient">

对于本地的 .mdf 文件:

<add name="MyConnectionString" connectionString="Data Source=(LocalDB)\MSSQLLocalDB; AttachDbFilename=|DataDirectory|\MyDatabase.mdf; Integrated Security=True;Connect Timeout=30" providerName="System.Data.SqlClient" />

那么,这里发生了什么事情?

这三种情况下的连接字符串是什么? - Neil
@Neil 我更新了问题。 - roozbeh S
这两台机器的SQL Server版本是否相同?(SQLExpress或其他)。最好指定MDF的完整路径,而不是使用“|DataDirectory|”。 - Neil
开发机器上安装了SQLServer 2016,但在目标机器上我安装了SQLLocalDB。 - roozbeh S
@Neil 没有,我没有尝试完整路径。但是,如果我删除数据库,EF会在|DataDirectory|文件夹中创建一个空的数据库,这样我们就可以确定路径是正确的。基本上这是令人困惑的部分:EF忽略了数据库文件的存在,并试图用新文件覆盖该文件。 - roozbeh S
显示剩余2条评论
2个回答

6

在我的情况下,进入C:\Program Files\Microsoft SQL Server\SQLSERVER\MSSQL\DATA文件夹并删除同名的'*.mdf'文件(如果存在)。 删除后重新创建数据库,问题得到解决。


5

对于在 Docker 中运行的 SQL Server:

由于我正在使用 Docker 中的 SQL Server,因此我必须使用 docker exec -it <CONTAINER ID> bash 进入 Docker 并从 /var/opt/mssql/data 目录中删除 mdf 文件。

步骤:

  1. docker ps -> 复制运行 SQL Server 的 Docker 容器的 CONTAINER ID
  2. docker exec -it <CONTAINER ID> bash -> 现在您可以查看/修改 Docker 中的文件
  3. cd /
  4. cd /var/opt/mssql/data -> 进入 mdf/ldf 文件所在的目录
  5. rm -rf <database_name>.mdf -> 删除 mdf 文件
  6. rm -rf <database_name>_log.ldf -> 删除 ldf 文件

这解决了我的问题。 在此输入图片描述


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