实体框架代码首次更新数据库在创建数据库上失败

本文关键字:数据库 创建 失败 更新 框架 代码 实体 | 更新日期: 2023-09-27 18:32:05

这篇文章已被注意到

这个也是如此

在我的开发机器上,我正在尝试使用包管理器控制台中的更新数据库重新创建数据库。我相信我已经按照上面引用的帖子中的说明进行操作。

我收到此错误消息:

发生文件激活错误。物理文件名 "''WRDatabase.mdf"可能不正确。诊断并纠正其他 错误,然后重试该操作。创建数据库失败。一些文件 无法创建列出的名称。检查相关错误。

我正在运行的命令是:

update-database -ConfigurationTypeName WRConfiguration  -ConnectionStringName localWR -Verbose

注意:在上面的命令中,我传递了一个连接字符串名称,并且似乎正在使用连接字符串,因为错误消息中出现了.mdf文件的名称。

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

这是应用程序配置:

<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>

AutomaticMigrationsEnabled 在 Configuration 类的构造函数中设置为 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; }
}  

实体框架代码首次更新数据库在创建数据库上失败

我在这里找到了答案:

http://kazimnami.azurewebsites.net/techblog/2012/11/24/error-a-file-activation-error-occurred-create-database-failed/

谢谢卡齐姆。

当"|不计算连接字符串中的 DataDirectory|" 属性。若要解决此问题,请在代码中添加以下行:

AppDomain.CurrentDomain.SetData("DataDirectory", System.IO.Directory.GetCurrentDirectory());
实际上你需要

把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; }
    //....
}
对我来说

,问题是我从(localdb)实例移动到了一个可靠的SQL服务器实例。为了让更新数据库创建所需的数据库,我必须删除 ;AttachDBFilename=|DataDirectory|'somedatabase.mdf

完全然后其他一切都按预期工作

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

如果之前的答案是正确的,则很容易通过命令行进行设置

Update-Database -AppDomainBaseDirectory C:'you-path

如果要进行集成测试,请使用通用控制器方法来设置目录。参见斯蒂芬的回答。

            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;
            }