我使用 CreateDatabaseIfNotExists 来初始化数据库,并且能够使用 update-database 并运行我的应用程序,如果数据库不存在,它将创建它。这似乎与 EF 6.0.x 不同。
This was useful, but not what I used.
我所做的是放弃我现有的初始化代码,并将其替换为 Global.asax 中的以下代码。
Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyContext, Configuration>());
using (MyContext temp = new MyContext())
{
temp.Database.Initialize(true);
}
注意:MyContext 是我使用的上下文,Configuration 是启用迁移时创建的配置文件。
我已经看到很多关于人们对此有问题的帖子,但描述解决方案的帖子并不多。我不知道为什么这么多人,包括我自己,都错过了这个突破性的变化......(如果在某个地方有关于这个的描述,我从来没有看到它,直到为时已晚。)
编辑:
这是我添加到上下文类中的代码。我不像以前那样喜欢它,但它现在可以完成工作。请参阅 @Doug 对 OP 对 CodePlex 投票的评论。
private static readonly Object syncObj = new Object();
public static bool InitializeDatabase()
{
lock (syncObj)
{
using (var temp = new TbdContext())
{
ObjectContext oc = null;
try
{
oc = temp.ObjectContext;
}
catch (Exception ex)
{
//Ignore error
Console.WriteLine(ex);
}
if (oc != null && oc.DatabaseExists())
{
return true;
}
Database.SetInitializer(new MigrateDatabaseToLatestVersion<TbdContext, Configuration>());
try
{
temp.Database.Initialize(true);
return true;
}
catch (DataException ex)
{
}
}
}
然后在我的 Global.asax.cs Application_Start() 我这样做:
if (databaseInitialized == false)
databaseInitialized = MyContext.InitializeDatabase();
编辑:
我升级到 EF 6.1 后发现它不再起作用了。(https://stackoverflow.com/a/22770517/2033294) 以下是我修复它的方法:
private static readonly Object syncObj = new Object();
public static bool InitializeDatabase()
{
lock (syncObj)
{
using (var temp = new MyContext())
{
if (temp.Database.Exists()) return true;
var initializer = new MigrateDatabaseToLatestVersion<MyContext, Configuration>();
Database.SetInitializer(initializer);
try
{
temp.Database.Initialize(true);
return true;
}
catch (Exception ex)
{
//Handle Error in some way
return false;
}
}
}
}