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