【问题标题】:ASP.NET MVC4 Code First - 'Cannot attach the file as database' exceptionASP.NET MVC4 代码优先 - “无法将文件附加为数据库”异常
【发布时间】:2013-03-20 01:51:16
【问题描述】:

我在实体框架中使用 Code First 概念,并且在启动应用程序时不断收到以下异常:

Cannot attach the file 'C:\Users\Admin\Documents\Visual Studio 2012\
Projects\Pro\Pro.Web\App_Data\Pro.mdf' as database 'Pro'.

我已将其放入Global.asax.cs,但也没有成功:

Database.SetInitializer(new DropCreateDatabaseIfModelChanges<ProWebContext>());
        var ctx = new ProWebContext();
        ctx.Database.Initialize(true);

我在 App_Data 目录下检查过,没有创建数据库。此外,在服务器资源管理器下,数据连接下没有任何内容。昨天一切正常,今天根本不工作。我尝试使用 SQL Server Management Studio 连接到 LocalDB,但它说它无法连接到本地数据库。任何想法可能是什么问题?

谢谢!

【问题讨论】:

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


    【解决方案1】:

    我找到了解决方案。使用最新的 SQL Server Management Studio,连接到本地数据库没有问题。需要像这样建立连接:

    登录后,我们仍然可以看到旧数据库存在,即使 App_Data 目录下和 Visual Studio 服务器资源管理器中的 Data Connections 下没有任何内容。当我们从 SQL Server Management Studio 中删除该数据库并再次启动应用程序时,附加数据库时不会再出现错误。

    【讨论】:

    • 有趣的答案,但是我认为有一个标准的方法可以解决这个问题,请参阅我的答案。
    • @Mzn 您的回答并没有为我解决问题。尝试后,我仍然不得不从内存中删除数据库(我已经从文件系统中删除了它)。我没有安装 SSMS,但我能够使用 Visual Studio 中的 SQL Server 对象资源管理器来查找和删除仍然存在的数据库引用。
    • @StaffordWilliams 所以解决方案仍然是删除数据库以允许 EF 重新创建它。 Cristiano 的方法是手动完成,我的是通过 DB 初始化程序完成。我不知道为什么在您的情况下使用 Initializer 不起作用。是不是框架使用的账号没有删除数据库的权限?如果你想再次删除/重新创建,你会再次手动执行吗?
    • @Mzn 是的,我不确定,我想我会在/如果我来的时候越过那座桥。
    【解决方案2】:

    我刚遇到同样的问题,但上面的答案有所帮助,解决方案不同。

    就我而言,我正在重用一个已经创建数据库的项目。而且由于配置中的名称相同,因此抛出异常,误导了真正的解决方案。

    值得检查的是数据库没有被创建并且与你之前使用的不同。更改名称并继续。

    【讨论】:

      【解决方案3】:

      当我看到这个时,我遇到了同样的错误,但我无法使用 SQL Server Management Studio 删除数据库,所以我记得IDatabaseInitializer。

      为我的 Code First 上下文设置数据库初始化程序解决了这个问题。在我的情况下,添加一个初始化程序以始终删除数据库工作(我在我的上下文的静态构造函数中添加了代码,大多数人将它添加到 Global.asax):

          static SomeDbContext()
          {
              System.Data.Entity.Database.SetInitializer(new DropCreateDatabaseAlways<SomeDbContext>());
          }
      

      当然还有其他的初始化器。

      【讨论】:

        【解决方案4】:

        我手动删除了 mdf 文件,因此代码将重新创建它,但遇到了同样的问题。我通过在包管理器控制台中运行 update-database 命令解决了这个问题。

        【讨论】:

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