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

时间:2013-06-09 18:33:20

标签: .net asp.net-mvc database entity-framework asp.net-mvc-4

基本上我已经按照教程并决定之后删除.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的新手,并且在这里不会有什么问题。

22 个答案:

答案 0 :(得分:111)

我认为对于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文件中的多个数据库,因此不支持指定初始目录(或者不支持,并且我有一些奇怪的错误)。

答案 1 :(得分:53)

看看这个:Entity Framework don't create database

  

我会尝试给数据库一个   不同的名字。有时您可能会遇到SQL Express问题   在尝试第二次创建具有相同名称的数据库时。   有一种方法可以使用SQL Server Management Studio来解决这个问题   通常更容易使用不同的数据库名称。

修改 这个答案被接受了,因为它确认了 bug 和OP使用的解决方法(重命名数据库可以帮助)。我完全同意重命名数据库并不是一种可接受的方式,并不能完全解决问题。不幸的是,我没有检查其他方法在SSMS中真正解决它。

答案 2 :(得分:31)

  1. 从Package Manager控制台运行:

    sqllocaldb.exe stop v11.0

    sqllocaldb.exe delete v11.0

  2. 运行您的项目

  3. 注册用户

答案 3 :(得分:15)

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

答案 4 :(得分:6)

&#34;无法附加文件&#39; C:\ Github \ TestService \ TestService \ App_data \ TestService.mdf&#34;作为数据库&#39; TestService&#39;

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

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

答案 5 :(得分:5)

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

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

答案 6 :(得分:2)

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

进入Visual Studio&gt;查看&gt; SQL Server对象资源管理器并删除旧数据库名称及其连接。再次重试您的应用程序,它应该在App_Data中安装.mdf文件,并在服务器资源管理器中再次创建相同的数据库。

答案 7 :(得分:1)

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

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

这里是Microsoft article,详细介绍了此问题。

答案 8 :(得分: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 ”;集成

答案 9 :(得分:1)

进入这个问题。在我的情况下,由于在iispexress仍在运行时删除了.mdf,因此仍在使用数据库。 右键单击系统托盘中的iisexpress,然后单击退出然后删除MDF以防止实际发生此错误。

要在VS中修复此错误,请右键单击App-Data文件夹添加新项&gt; SQL Server数据库。名称:[使用update-database错误提供的数据库名称] 单击添加。

答案 10 :(得分:1)

在遵循&#34; ASP.NET MVC 5入门|的教程时遇到了同样的错误Microsoft Docs&#34;。我在Visual Studio 2015上。 我打开了View-&gt; SQL Server对象资源管理器并删除了教程后命名的数据库,然后就可以了。 见Delete .mdf file from app_data causes exception cannot attach the file as database

答案 11 :(得分:1)

我发现注释掉用于初始化数据库的上下文部分解决了问题。 Havnt有时间找出播种声明的错误,但删除播种解决了这个问题。

答案 12 :(得分:1)

使用SQL SERVER Management Studio修复此问题

您的问题:您收到错误消息,例如&#39;无法附加文件&#39; YourDB.mdf&#39; as database&#39; YourConnStringNamedContext&#39 ;;

原因:是因为您删除了后备文件.mdf,ldf而没有实际删除正在运行的SqlLocalDb实例中的数据库;在VS中重新运行代码不会有帮助,因为你无法重新创建一个具有相同名称的数据库(这就是为什么重命名有效,但是留下了旧的幻像数据库名称)。

修复:我使用的是VS2012,对于不同的版本采用类似的方法。

导航至以下路径并输入

  

c:\ program files \ microsoft sql server \ 110 \ Tools \ Binn&gt; sqllocaldb info

以上cmd显示实例名称,包括&#39; v11.0&#39;

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

  

sqllocaldb info v11.0

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

如果State未运行或停止,请使用

启动实例
  

sqllocaldb start v11.0

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

在SS Management Studio&#39; Connect&#39;对话框输入

  

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

     

身份验证:Windows身份验证

     

用户名:(与所有者相同,Win。身份验证时显示为灰色。)

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

完成!一旦它消失,VS EF应该没有问题重新创建它。

答案 13 :(得分:1)

根据@ davide-icardi,删除“Initial Catalog = 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>

答案 14 :(得分: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'命令而不会出错。 希望这可以帮助。

答案 15 :(得分:0)

奇怪的是,对于完全相同的问题,有什么帮助我改变了&#39;到&#39; v11.0&#39;在配置的以下部分。

A2 = array(apply(X, 1L, function (x) outer(x,x)), dim=c(10,10,20))

# test
X <- matrix(seq(10*20),20,10)
A <- array(dim=c(10,10,20))
for (i in 1:10){
  for (j in 1:10){
    A[i,j,] <- X[,i] * X[,j]
  }
}

all.equal(A, A2) # TRUE

答案 16 :(得分:0)

我们在使用ASP.Net Core 2.1运行dotnet ef database update时遇到了这个问题。看起来AttachDbFileName不支持相对路径。

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

只是想在这里为那些可能碰到这个问题的人表达。 “修复”是使用绝对路径。

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

答案 17 :(得分:0)

我有同样的错误。 奇怪的是,我有一个新的项目表单,它完美地工作,另一个更大的项目,我总是遇到错误信息。

完全正常工作的项目(几乎)总是自动创建数据库(包括文件)。它可以是任何命令,读取,写入,更新。文件被创建。 当然它使用

DropCreateDatabaseIfModelChanges

只有一种情况,当它遇到麻烦时:如果mdf是自动创建的,则删除mdf和日志文件。那是关于它的。跟你的自我创造道别......

我找到修复它的唯一方法就像提到的那样:

sqllocaldb stop v11.0 & sqllocaldb delete v11.0

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

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

令人困惑的是,如果出现其他问题,我也会收到此错误。 所以我的建议是,如果你想确保你的数据库设置是健全的: 从头开始创建新的解决方案/项目,使用最基本的DB命令(添加实体,显示所有实体,删除所有实体)并查看它是否有效。

如果是,则问题出现在VS2013配置和版本控制以及nuget和东西的深渊中。

如果否,您的LocalDB安装有问题。

对于任何真正想要了解EF中发生的事情的人(我仍然不确定我是否这样做:-)) http://odetocode.com/Blogs/scott/archive/2012/08/14/a-troubleshooting-guide-for-entity-framework-connections-amp-migrations.aspx

P.S。:如果您需要正在运行的示例项目,请轻推我。

答案 18 :(得分:0)

如果您恰好应用迁移,则可以解决此问题。

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

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

日期字符串应与您的迁移中的第一个数字相匹配。

答案 19 :(得分: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" />

答案 20 :(得分:0)

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

答案 21 :(得分:0)

重新创建数据库。不要删除它,你的应用程序应继续工作。