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

时间:2013-09-18 21:21:19

标签: c# entity-framework-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使用两个连接字符串)。

这是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 个答案:

答案 0 :(得分:38)

我在这里找到了答案:

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

谢谢kazim。

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

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

答案 1 :(得分: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; }
    //....
}

答案 2 :(得分:0)

如果以前的答案是正确的,可以通过命令行轻松设置

Update-Database -AppDomainBaseDirectory C:\you-path

答案 3 :(得分:0)

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

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

答案 4 :(得分: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;
            }

答案 5 :(得分:0)

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