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


74

基本上,我已按照教程进行操作,并决定.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对象资源管理器,但看起来如下:

另外,在服务器资源管理器中,我看不到任何数据连接。

当我尝试在Server Explorer中添加新连接时,我看不到任何名为的数据库OdeToFoodDb

抱歉,这个问题很广泛,但是我是Entity Framework的新手,还不太了解这里的问题。


4
您说您删除了.mdf文件。那是SQL Server数据库文件。如果已删除它,则没有数据库,因此会出现错误。
STLDev 2013年

想说同样的事情@STLDeveloper,代码如何继续,如果不找到所需的DB ...
Owais库雷希

编译后,您的mvc项目的bin \ Debug \ App_Data文件夹中是否有一个OdeToFooDb.mdf?
Rene 2013年

2
@rene否根本没有mdf文件。如何生成MDF文件?
约翰·梅耶

1
@rene根本没有mdf文件。我尝试重命名dbcontext类,现在它可以工作了。是什么引起了该问题?
约翰·梅耶

Answers:


60

看一看:实体框架不创建数据库

我会尝试给数据库起一个不同的名字。有时,当您尝试第二次创建具有相同名称的数据库时,SQL Express可能会遇到问题。有一种使用SQL Server Management Studio修复此问题的方法,但通常只使用其他数据库名称会更容易。

编辑 接受此答案是因为它确认了OP使用的错误和解决方法(重命名数据库可能会有所帮助)。我完全同意,重命名数据库并不是真正可以接受的方式,并且不能完全解决问题。不幸的是,我没有检查在SSMS中真正解决它的其他方法。


3
我真的很想使用SSMS来了解此修复程序,因为我遇到了同样的问题,并且希望保持数据库名称不变。
julealgon 2014年

是的,请@Chris,您如何使用SSMS解决此问题?
伊恩·坎贝尔

@julealgon,该过程在此处
Bogac 2014年

3
哟不需要做到这一点,只能删除从Visual Studio中的SQL Server对象资源管理器查看德数据库(和关闭连接)
塞巴斯蒂安·罗哈斯

我认为这不是一个好方法,绝对不能用于生产系统。
Xan-Kun Clark-Davis

124

我认为对于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" />

我认为本地db在同一个mdf文件上不支持多个数据库,因此不支持指定初始目录(或不完全支持初始目录,并且出现一些奇怪的错误)。


18
从连接字符串中删除“初始目录”部分对我来说解决了这个问题。
Tim Friesen 2014年

2
所有其他建议完全是矫over过正。这很简单,简洁而且有效。
Jammer

这与真正的问题有关。当然,您可以指定目录名称。
Xan-Kun Clark-Davis

8
这是问题的实际答案,或者至少对于此错误,是更好的解决方法。关于这个问题的官方答案是错误的。
内森·麦卡斯凯尔

2
换句话说,对于localdb,您需要将“ initial catalog = ...”替换为“ AttachDBFilename = ...”,否则在尝试打开连接时会出现随机的SqlExceptions。
seguso

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

    sqllocaldb.exe stop v11.0

    sqllocaldb.exe delete v11.0

  2. 运行你的项目

  3. 注册用户

而不是在Web配置中v11.0输入MSSQLLocalDB连接字符串是这样的data source=(LocalDb)\MSSQLLocalDB;...
-Zoha

16

从应该执行此操作的连接字符串中删除此行;)“ AttachDbFilename = | DataDirectory | whateverurdatabasenameis-xxxxxxxxxx.mdf”


也为我工作。这可能是答案。
马特·韦斯特

11
等一下 什么?您想要指定一个db文件,那么您绝对需要此行,也可以不需要。然后,您绝对必须忽略此行。这绝不能解决潜在的问题。
Xan-Kun Clark-Davis

6

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

当您遇到上述错误消息时,请执行以下步骤。

  1. 打开SQL Server对象资源管理器
  2. 单击刷新按钮。
  3. 展开(localdb)\ MSSQLLocalDB(SQL Server 12.x.xxxxx-xxxxx \ xxxx)
  4. 展开资料库
  5. 请删除现有的同名数据库
  6. 单击右键,然后删除
  7. 返回您的包裹管理控制台
  8. 更新数据库

5

我也遇到过同样的问题。VS 2013中的以下步骤为我解决了这个问题:

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

:-)在我看来,您曾经通过资源管理器而不是Database.Delete();删除了mdf文件命令。
Xan-Kun Clark-Davis

3

使用SQL SERVER Management Studio修复此问题

您的问题:您收到诸如无法将文件“ YourDB.mdf”附加为数据库“ YourConnStringNamedContext”之类的错误;

原因:发生这种情况是因为您删除了备份文件.mdf,ldf而没有实际删除正在运行的SqlLocalDb实例中的数据库;在VS中重新运行代码将无济于事,因为您无法重新创建具有相同名称的数据库(这就是重命名有效的原因,但是保留了旧的幻影数据库名称)。

解决方法:我使用的是VS2012,不同版本也采用类似的方法。

导航到以下路径并输入

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

cmd上方显示了实例名称,包括“ v11.0”

如果实例已经在运行,请在提示符下输入

sqllocaldb信息v11.0

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

如果State未运行或停止,请使用以下命令启动实例

sqllocaldb启动v11.0

并提取与上述相同的信息。

在SS Management Studio的“连接”对话框中,输入

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

身份验证:Windows身份验证

用户名:(与所有者相同,对于Win身份验证为灰色)

连接后,找到已删除的幻像数据库(例如,YourDB.mdf应该已创建一个名为YourDB的数据库),然后将其真正删除。

做完了!一旦它消失了,VS EF就可以毫无问题地重新创建它。


2

您已经在服务器资源管理器中安装了该数据库的旧副本。因此,这是服务器对象资源管理器/ SQL Server中的简单命名冲突。在决定将其移动到Apps_Data文件夹之前,您可能已经创建了相同的数据库目录名称。这样数据库名称已经存在,只需要删除即可。

只需进入Visual Studio>“视图”>“ SQL Server对象资源管理器”,然后删除旧的数据库名称及其连接。再次重试您的应用程序,它应在App_Data中安装.mdf文件,并在服务器资源管理器中再次创建相同的数据库。


1
这是正确的答案,因为它实际上解决了核心问题。另一个答案仅提供解决方法。
尼克·弗利特伍德

没错,这个和@YTKim的答案-所有其他答案仍然将旧数据库引用留在LocalDB配置中,并且不会两次解决相同的问题。
Samuel Jaeschke '18

1

按照@ davide-icardi,删除“初始目录= xxx;”。从web.config,也要检查您的azure发布配置文件,也可以从此处将其删除:
[YourAspNetProject路径] \ 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>

1

我发现注释掉用于初始化数据库的上下文部分可以解决此问题。Havnt有时间找出播种语句出了什么问题,但是删除播种解决了问题。



1

遇到这个问题。在我的情况下,是由于在iispexress仍在运行并因此仍在使用DB的情况下删除了.mdf引起的。右键单击系统托盘中的iisexpress,然后单击退出,然后删除MDF以防止实际发生此错误。

要仅在VS中解决此错误,请右键单击“ App-Data”文件夹,添加新项>“ SQL Server数据库”。名称:[使用更新数据库错误提供的数据库名称]单击添加。


1

只需从web.config项目级别更改数据库名称文件,然后更新数据库。

connectionString =数据源=(LocalDb)\ MSSQLLocalDB; AttachDbFilename =“ | DataDirectory | \ aspnet-项目名称-2018041307050 6 .mdf”;初始目录=“ aspnet--2018041307050 6 ”;已集成

将粗体数字更改为其他数字:

connectionString =数据源==(LocalDb)\ MSSQLLocalDB; AttachDbFilename =“ | DataDirectory | \ aspnet-项目名称-2018041307050 7 .mdf”;初始目录=“ aspnet--2018041307050 7 ”;已集成


1

我没有阅读所有响应,但是,如果您的.mdf文件不属于SQL安装路径(如)的一部分C:\Temp,则SQL数据库引擎服务帐户将无权创建和写入.ldf文件,甚至无法读取文件。.mdf文件。 。

解决方案是您必须向运行SQL实例服务的SQL Server数据库引擎服务帐户授予文件系统权限。因此,对我来说,我通过Windows资源管理器授予了C:\Temp对包含和帐户.mdf文件的路径的完全控制权限。NT Service\MSSQL$SQLEXPRESS01NT Service\MSSQL$MSSQL2016

这是Microsoft文章,详细介绍了此问题。


0

重新创建数据库。请勿删除它,您的应用程序应继续运行。


4
抱歉,您的问题很愚蠢,但是如何重新创建数据库?
约翰·梅耶

哦-这可能比我想的还要糟。您是否在任何地方都有.mdf文件的副本?您是从哪里获得的?也许您有一个SQL Server脚本,它将为您重新创建数据库。
STLDev 2013年

抱歉,我的回复很晚:我已经用以下代码生成了它: public class OdeToFoodDB : DbContext { public DbSet<Restaurant> Restaurants { get; set; } public DbSet<RestaurantReview> Reviews { get; set; } } 然后我对其进行了初始化(但是在这里我得到了错误): OdeToFoodDB db = new OdeToFoodDB(); public ActionResult Index() { var model = db.Restaurants.ToList(); return View(model); }
John Mayer 2013年

我尝试重命名dbcontext类,现在它可以工作了。是什么引起了该问题?
约翰·梅耶

0

我有同样的错误。奇怪的是,我从头开始有了一个新的项目表格,在这里工作正常,而另一个更大的项目,我总是遇到该错误消息。

性能良好的项目(几乎)总是自动创建数据库(包括文件)。它可以是任何命令,读取,写入,更新。文件被创建。当然会用

DropCreateDatabaseIfModelChanges

只有一种情况会出现问题:如果自动创建了mdf,并且您删除了mdf和日志文件。然后就是这样。与您的自动创建说再见...

我发现修复它的唯一方法是提到:

sqllocaldb stop v11.0 & sqllocaldb delete v11.0

之后,一切恢复正常(并且所有其他由LocalDB处理的数据库也消失了!)。

编辑:那是不正确的。我刚刚尝试过,v11.0会自动重新创建,并且所有mdf都保持可用。我没有尝试使用“基于非文件”的LocalDB。

令人困惑的是,如果还有其他错误,我也会收到此错误。因此,我的建议是,如果您要确保数据库设置正确无误:从头开始创建新的解决方案/项目,使用最基本的数据库命令(添加实体,显示所有实体,删除所有实体)并查看如果可行。

如果是,则问题出在VS2013配置和版本控制以及nuget和其他内容的深渊中。

如果不是,则您的LocalDB安装有问题。

对于那些真的想了解EF中发生了什么的人(我仍然不确定是否可以进行:-)) http://odetocode.com/Blogs/scott/archive/2012/08/14/a-troubleshooting-实体框架连接指南-amp-migrations.aspx

PS:如果您需要运行的示例项目,请轻推我。


0

奇怪的是,对于完全相同的问题,帮助我的是在配置的以下部分中将'更改为'v11.0'。

<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>

0

我最近遇到了同样的问题。这是要检查的一件事。在Visual Studio中,我们应该检查和删除数据库的三个地方。

1. Solution Explorer's App_Data folder
2. Server Explorer's Data Connection menu
3. SQL Server Object Explorer

当我从前两点删除数据库时,仍然会发生错误。因此,我还需要从SQL Server对象资源管理器中删除数据库。然后,我可以轻松地运行“ update-database”命令而不会出错。希望这可以帮助。


0

dotnet ef database update使用ASP.Net Core 2.1运行时,我们只是自己碰到了这一点;似乎不支持相对路径AttachDbFileName

System.Data.SqlClient.SqlException (0x80131904): Cannot attach the file '.\OurDbName.mdf' as database 'OurDbName'.

只是想在这里向可能碰到这个问题的其他人表示这一点。“修复”是使用绝对路径。

另请参阅:https : //github.com/aspnet/EntityFrameworkCore/pull/6446


0

如果您碰巧已经应用了迁移,则可以解决此问题。

转到Web.config并根据迁移文件更新连接字符串。

Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\aspnet-GigHub-201802102244201.mdf;Initial Catalog=aspnet-GigHub-201802102244201;

日期字符串应与“迁移”中的前几个数字匹配。


0

遇到类似的问题不完全相同,一个数据库已经存在的情况,通过以下代码解决了该问题。

<add name="DefaultConnection" connectionString="Data Source=.;AttachDbFilename=|DataDirectory|\aspnet-EjournalParsing-20180925054839.mdf;Initial Catalog=aspnet-EjournalParsing-20180925054839;Integrated Security=True"
      providerName="System.Data.SqlClient" />


删除数据源相同的文件,让你的位置可以是本地或服务器
Sumanstm21

0

就我而言,Initail Cataloge=....从连接字符串中删除可解决此问题

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.