我使用 CreateDatabaseIfNotExists 来初始化数据库,并能够使用更新数据库并运行我的应用程序,如果数据库尚不存在,它将创建该数据库。这似乎在 EF 6.0.x 中已被破坏。
这很有用,但不是我用过的。
我所做的就是放弃现有的初始化代码,并将其替换为 Global.asax 中的以下代码。
Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyContext, Configuration>());
using (MyContext temp = new MyContext())
{
temp.Database.Initialize(true);
}
注意:MyContext 是我使用的上下文,Configuration 是启用迁移时创建的配置文件。
我看过很多帖子,人们对此有疑问,但描述解决方案的帖子并不多。我不知道为什么这么多人,包括我自己,都错过了这个重大改变......(如果有关于这个的描述,我从来没有看到它,直到为时已晚。)
Edit:
这是我添加到上下文类中的代码。我不像以前那样喜欢它,但它现在可以完成工作了。请参阅@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();
Edit:
我升级到 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;
}
}
}
}