Entity Framework的Code First更新数据库失败,出现CREATE DATABASE错误。

17

这篇文章已被记录下来。

这篇也是。

在我的开发机器上,我正在尝试使用包管理器控制台中的update-database重新创建数据库。 我相信我已经按照上述文章中的说明进行了操作。

我收到以下错误消息:

发生文件激活错误。 物理文件名 '\ WRDatabase.mdf' 可能不正确。 诊断和纠正其他错误,并重试操作。 CREATE DATABASE 失败。 某些列出的文件名无法创建。 检查相关的错误。

我运行的命令是:

update-database -ConfigurationTypeName WRConfiguration  -ConnectionStringName localWR -Verbose

注意命令中我传递了连接字符串名称,看起来连接字符串正在使用,因为.mdf文件的名称出现在错误消息中。

有趣的是,我能够运行我的代码并创建数据库,但它被创建的名称不正确(它被命名为“VIN.DataModel.WRContext”,这是DbContext的完整命名空间和类名)。我的猜测是当我的代码运行EF时,无法找到用于创建数据库的连接字符串。这是有意为之的,因为我将把此上下文映射到在服务器上运行的数据库以及在本地计算机上运行的db的副本(即,我将为同一DbContext拥有两个连接字符串)。

这是app config:

<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
  <parameters>
    <parameter value="v11.0" />
  </parameters>
</defaultConnectionFactory>
</entityFramework>
<connectionStrings>
     <add name="localWR" providerName="System.Data.SqlClient" connectionString="Data Source=(LocalDB)\v11.0;Initial Catalog =WRDatabase;AttachDBFilename=|DataDirectory|\WRDatabase.mdf; Integrated Security=True;MultipleActiveResultSets=True" />
</connectionStrings>

在 Configuration 类的构造函数中,AutomaticMigrationsEnabled 被设置为 false。

以下是上下文类:

public class WRContext : DbContext
{
    static WRContext()
    {
        Database.SetInitializer(new MigrateDatabaseToLatestVersion<WRContext, VIN.DataModel.WRMigrations.WRConfiguration>());
    }

    public WRContext()
    {

    }

    public WRContext(string connectionString)
        : base(connectionString)
    { 

    }


    public DbSet<Emp> Emps { get; set; }
    public DbSet<Inv> Invs { get; set; }
    public DbSet<WRConfig> WRConfigs { get; set; }
}  
6个回答

39

1
我们不鼓励只提供链接的回答,因为如果链接到的内容被移动或删除,该回答就会变得无用。您能简要总结一下自己的解决方案吗? - anaximander
我无法确定这应该放在哪里。我尝试了Configuration.cs以及我的第一个迁移文件中的构造函数。但两种情况都没有起作用。 - Stephen York
我正在进行集成测试,并将其添加到通用API控制器设置处理程序中。 - Spencer
最佳答案!你是我的神! - Jerry Chou

14

实际上,您需要将OP答案中提供的代码行放入扩展的xxContext:dbContext类中。

public class WRContext : DbContext
{
    public WRContext()
        : base("localWR")
    {
        AppDomain.CurrentDomain.SetData("DataDirectory", System.IO.Directory.GetCurrentDirectory());
    }
    public DbSet<Emp> Emps { get; set; }
    //....
}

2
对我来说问题是从(localdb)实例移动到了一个稳定的SQL服务器实例。为了让update-database创建所需的数据库,我必须完全删除;AttachDBFilename=|DataDirectory|\somedatabase.mdf,然后其他所有内容按预期工作。

1
在我的情况下,问题只是它想要放置数据库文件的文件夹不存在。 显然,由于某种原因,Visual Studio无法为您创建目录。

0
如果你正在进行集成测试,那么使用通用控制器方法来设置目录。请参考StefanG的答案。
            public static T SetupController<T>() where T : ApiController, new()
            {
                //LocalDB database to the tests directory.
                AppDomain.CurrentDomain.SetData("DataDirectory", System.IO.Directory.GetCurrentDirectory());

                var request = new HttpRequestMessage();

                var config = WebApiConfig.SetupRegister(new HttpConfiguration());

                var controller = new T()
                {
                    Request = request,
                    Configuration = config
                };

                return controller;
            }

0
如果前面的答案是正确的,那么通过命令行设置就很容易。
Update-Database -AppDomainBaseDirectory C:\you-path

这真的有效吗?我的意思是,如果你调用它,它会在幕后将“|DataDirectory|”替换为“C:\your-path”吗? - pitersmx

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