实体框架代码第一次更新 - 数据库在CREATE DATABASE上失败

问题描述 投票:16回答:5

This post has been noted

So has this one

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

我收到此错误消息:

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

我正在运行的命令是:

update-database -ConfigurationTypeName WRConfiguration  -ConnectionStringName localWR -Verbose

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

有趣的是,我能够运行我的代码并且我的数据库已经创建,但它是用错误的名称创建的(它名为“VIN.DataModel.WRContext”,它是DbContext的完整命名空间和类名)。我的猜测是,当我的代码运行时,EF无法找到用于创建数据库的连接字符串。这是故意的,因为我将此上下文映射到在服务器上运行的数据库以及在本地计算机上运行的db的副本(即,我将为相同的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>

在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; }
}  
c# entity-framework-5
5个回答
38
投票

我在这里找到了答案:

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

谢谢kazim。

“| DataDirectory |”时抛出异常不评估连接字符串中的属性。要解决此问题,请在代码中添加以下行:

AppDomain.CurrentDomain.SetData("DataDirectory", System.IO.Directory.GetCurrentDirectory());

11
投票

实际上你需要将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; }
    //....
}

0
投票

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

Update-Database -AppDomainBaseDirectory C:\you-path

0
投票

对我来说,问题是我从一个(localdb)实例转移到一个可靠的SQL服务器实例。为了让update-database创建所需的数据库,我必须删除;AttachDBFilename=|DataDirectory|\somedatabase.mdf

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


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;
            }
© www.soinside.com 2019 - 2024. All rights reserved.