Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架代码首次更新数据库在创建数据库时失败_C#_Entity Framework 5 - Fatal编程技术网

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

C# 实体框架代码首次更新数据库在创建数据库时失败,c#,entity-framework-5,C#,Entity Framework 5,在我的开发机器上,我试图使用PackageManager控制台中的更新数据库重新创建我的数据库。我相信我已经按照上面引用的帖子中的说明进行了操作 我收到以下错误消息: 发生文件激活错误。物理文件名 “\WRDatabase.mdf”可能不正确。诊断并纠正附加故障 错误,然后重试该操作。创建数据库失败。一些文件 无法创建列出的名称。检查相关错误 我正在运行的命令是: update-database -ConfigurationTypeName WRConfiguration -Connectio

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

我收到以下错误消息:

发生文件激活错误。物理文件名 “\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>

在配置类的构造函数中,AutomaticMiggerationsEnabled设置为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; }
}  
公共类WRContext:DbContext
{
静态上下文()
{
SetInitializer(新的MigrateDatabaseToLatestVersion());
}
公共上下文()
{
}
公共上下文(字符串连接字符串)
:基本(连接字符串)
{ 
}
公共数据库集Emps{get;set;}
公共DbSet Invs{get;set;}
公共DbSet WRConfigs{get;set;}
}  

我在这里找到了答案:

谢谢你,卡辛

未计算连接字符串中的“| DataDirectory |”属性时引发异常。要解决此问题,请在代码中添加以下行:

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

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

Update-Database -AppDomainBaseDirectory C:\you-path

实际上,您需要将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; }
    //....
}
公共类WRContext:DbContext
{
公共上下文()
:base(“localWR”)
{
AppDomain.CurrentDomain.SetData(“DataDirectory”,System.IO.Directory.GetCurrentDirectory());
}
公共数据库集Emps{get;set;}
//....
}

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


如果您进行集成测试,则使用通用控制器方法设置目录。见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;
            }
publicstatict SetupController(),其中T:ApiController,new()
{
//LocalDB数据库到tests目录。
AppDomain.CurrentDomain.SetData(“DataDirectory”,System.IO.Directory.GetCurrentDirectory());
var request=new-HttpRequestMessage();
var config=WebApiConfig.SetupRegister(新的HttpConfiguration());
var控制器=新的T()
{
请求=请求,
配置=配置
};
返回控制器;
}

在我的例子中,只是它想将数据库文件放入的文件夹不存在。显然,由于某些原因,visual studio无法为您创建目录。

不鼓励只链接答案,因为如果要链接的内容被移动或删除,答案将变得无用。你能用你自己的话简单地总结一下解决方案吗?我不知道这应该是怎么回事。我在第一个迁移文件中尝试了Configuration.cs和构造函数。在这两种情况下都不起作用。我正在做集成测试,并将其添加到一个通用api控制器设置处理程序中。最佳答案!你是我的上帝!这真的有效吗?我的意思是,如果你叫它,它会将幕后的
| DataDirectory
替换为
C:\you path