【问题标题】:Cannot attach the file *.mdf as database无法将文件 *.mdf 作为数据库附加
【发布时间】:2013-06-09 18:33:20
【问题描述】:

基本上我已经按照教程,然后决定删除.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 的新手,不太明白这里出了什么问题。

【问题讨论】:

  • 您说您删除了 .mdf 文件。那是 SQL Server 数据库文件。如果您已删除它,则没有数据库,因此会出现错误。
  • 想说和@STLDeveloper一样的话,代码找不到需要的DB怎么继续……
  • 编译后你的mvc项目的bin\Debug\App_Data文件夹下是否有OdeToFooDb.mdf?
  • @rene 否 根本没有 mdf 文件。如何生成 mdf 文件?
  • @rene 根本没有 mdf 文件。我尝试重命名 dbcontext 类,现在它可以工作了。什么可能导致了这个问题?

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


【解决方案1】:

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

【讨论】:

  • 从连接字符串中删除“初始目录”部分为我解决了这个问题。
  • 所有其他建议都完全是矫枉过正。这很简单,简洁且有效。
  • 这与真正的问题有关。当然,您可以指定目录名称。
  • 这是问题的实际答案,或者至少对于这个错误来说是一个更好的解决方法。这个问题的官方回答是错误的。
  • 也就是说,对于localdb,需要将“initial catalog = ...”替换为“AttachDBFilename = ...”,否则在尝试打开连接时会出现随机的SqlExceptions。跨度>
【解决方案2】:

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

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

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

【讨论】:

  • 我真的很想知道这个使用 SSMS 的修复,因为我遇到了同样的问题,我想保持数据库名称不变。
  • 是的,@Chris,您如何解决 SSMS 的这个问题?
  • @julealgon 该过程解释了here
  • 你不需要这样做,只需从 Visual Studio SQL Server 对象资源管理器视图中删除数据库(并关闭连接)
  • 我认为这不是一个好方法,而且绝对不能用于生产系统。
【解决方案3】:
  1. 从包管理器控制台运行:

    sqllocaldb.exe stop v11.0

    sqllocaldb.exe delete v11.0

  2. 运行您的项目

  3. 注册用户

【讨论】:

  • 而不是v11.0 输入MSSQLLocalDB 在web config 连接字符串是这样的data source=(LocalDb)\MSSQLLocalDB;...
【解决方案4】:

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

【讨论】:

  • 也为我工作。这应该是答案。
  • 等等。什么?要么你想指定一个 db 文件,那么你绝对需要这一行,或者你不需要。那么你绝对必须省略这一行。这绝不是解决根本问题。
【解决方案5】:

“无法将文件'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. 更新数据库

【讨论】:

    【解决方案6】:

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

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

    【讨论】:

    • :-) 在我看来,您曾经通过资源管理器删除了 mdf 文件,而不是使用 Database.Delete(); 命令。
    【解决方案7】:

    使用 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 info v11.0

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

    如果状态没有运行或停止,启动实例

    sqllocaldb 启动 v11.0

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

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

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

    身份验证:Windows 身份验证

    用户名:(同Owner,Win.auth灰显)

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

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

    【讨论】:

      【解决方案8】:

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

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

      【讨论】:

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

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

      要修复此错误,只需在 VS 中右键单击 App-Data 文件夹添加新项目 > SQL Server 数据库。名称:[使用更新数据库错误提供的数据库名称] 单击添加。

      【讨论】:

      • 谢谢,这是正确答案
      【解决方案10】:

      根据@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>
      

      【讨论】:

        【解决方案11】:

        我发现注释掉用于初始化数据库的上下文部分解决了这个问题。还没来得及找出种子语句有什么问题,但删除种子就解决了问题。

        【讨论】:

          【解决方案12】:

          我在遵循“ASP.NET MVC 5 入门 | Microsoft Docs”教程时遇到了同样的错误。我在 Visual Studio 2015 上。 我打开 View-> SQL Server Object Explorer 并删除了以教程命名的数据库,然后它就可以工作了。 见Delete .mdf file from app_data causes exception cannot attach the file as database

          【讨论】:

            【解决方案13】:

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

            connectionString = 数据源 =(LocalDb)\MSSQLLocalDB;AttachDbFilename="|DataDirectory|\aspnet-Project name-20180413070506.mdf";Initial Catalog=" aspnet--20180413070506";集成

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

            connectionString = 数据源==(LocalDb)\MSSQLLocalDB;AttachDbFilename="|DataDirectory|\aspnet-Project name-20180413070507.mdf";Initial Catalog= "aspnet--20180413070507";集成

            【讨论】:

              【解决方案14】:

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

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

              这是一个Microsoft article,详细说明了这个问题。

              【讨论】:

                【解决方案15】:

                重新创建您的数据库。不要删除它,您的应用应该可以继续工作。

                【讨论】:

                • 抱歉这个愚蠢的问题,但我该如何重新创建数据库?
                • 哦——这可能比我想象的还要糟糕。您在任何地方都有 .mdf 文件的副本吗?你最初是从哪里得到的?也许您有一个 SQL Server 脚本可以为您重新创建数据库。
                • 抱歉回复晚了:我用以下代码生成了它:public class OdeToFoodDB : DbContext { public DbSet&lt;Restaurant&gt; Restaurants { get; set; } public DbSet&lt;RestaurantReview&gt; Reviews { get; set; } } 然后我初始化它(但这里我得到了错误):OdeToFoodDB db = new OdeToFoodDB(); public ActionResult Index() { var model = db.Restaurants.ToList(); return View(model); }
                • 我尝试重命名 dbcontext 类,现在它可以工作了。什么可能导致了这个问题?
                【解决方案16】:

                我有同样的错误。 奇怪的是,我有一个从头开始的新项目,它运行良好,而另一个更大的项目,我总是遇到该错误消息。

                完美运行的项目(几乎)总是自动创建数据库(包括文件)。它可以是任何命令,读、写、更新。文件被创建。 当然它使用

                DropCreateDatabaseIfModelChanges
                

                只有一种情况会遇到麻烦:如果 mdf 是自动创建的,而您删除了 mdf 和日志文件。然后就是这样。告别你的自创...

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

                sqllocaldb stop v11.0 & sqllocaldb delete v11.0
                

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

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

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

                如果是,则问题出在 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.:如果您需要正在运行的示例项目,请轻推我。

                【讨论】:

                  【解决方案17】:

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

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

                  【讨论】:

                    【解决方案18】:

                    我最近遇到了同样的问题。这是要检查的一件事。 在 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”命令而不会出错。 希望这可以帮助。

                    【讨论】:

                      【解决方案19】:

                      我们自己在使用 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

                      【讨论】:

                        【解决方案20】:

                        如果您碰巧已经应用了迁移,这可能会解决它。

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

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

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

                        【讨论】:

                          【解决方案21】:

                          遇到了类似的问题,不完全一样,一个数据库已经存在的案例,通过下面的代码解决了。

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

                          【讨论】:

                          • 删除数据源中的同一个文件,并给出你的位置,可以是本地或服务器
                          【解决方案22】:

                          在我的情况下,从连接字符串中删除 Initial Catalog=.... 解决了这个问题

                          【讨论】:

                            猜你喜欢
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2012-10-11
                            • 1970-01-01
                            • 1970-01-01
                            • 2013-03-15
                            • 1970-01-01
                            相关资源
                            最近更新 更多