使用EF 4.3在应用程序启动时执行所有必需的数据库迁移的最佳方法是什么?
答案 0 :(得分:53)
最好的方法是使用新的MigrateDatabaseToLatestVersion
初始化程序。
Database.SetInitializer<YourContext>(
new MigrateDatabaseToLatestVersion<YourContext, YourMigrationsConfig>());
Database.Initialize(false);
答案 1 :(得分:6)
可以在ADO.NET团队博客的EF 4.3 Configuration File Settings找到有关EF 4.3配置选项的精彩描述。最后一节介绍了数据库初始化程序,包括新的Code First MigrateDatabaseToLatestVersion
初始化程序。
尽管Entity Framework与.NET 4.x的许多其他功能相比,它们优于配置,但这是一种通过应用程序的配置文件设置MigrateDatabaseToLatestVersion
数据库初始化程序非常有用的情况。而不是显式编码到您的应用程序中。
答案 2 :(得分:4)
我需要明确地这样做,因为我使用超级上下文进行迁移,这是其他迁移的超集。关键位是:
var dbMigrator = new System.Data.Entity.Migrations.DbMigrator(
new Lcmp.EF.Migrations.Migrations.Configuration());
dbMigrator.Update();
随着Elmah日志的记录,我实际上使用了这个,从Application_Start()调用。它的碎片是从别人的想法中偷走的。我并不认为线程安全联锁部分是必要的。
public static int IsMigrating = 0;
private static void UpdateDatabase()
{
try
{
if (0 == System.Threading.Interlocked.Exchange(ref IsMigrating, 1))
{
try
{
// Automatically migrate database to catch up.
Elmah.ErrorLog.GetDefault(null).Log(new Elmah.Error(new Exception("Checking db for pending migrations.")));
var dbMigrator = new System.Data.Entity.Migrations.DbMigrator(new Lcmp.EF.Migrations.Migrations.Configuration());
var pendingMigrations = string.Join(", ", dbMigrator.GetPendingMigrations().ToArray());
Elmah.ErrorLog.GetDefault(null).Log(new Elmah.Error(new Exception("The database needs these code updates: " + pendingMigrations)));
dbMigrator.Update();
Elmah.ErrorLog.GetDefault(null).Log(new Elmah.Error(new Exception("Done upgrading database.")));
}
finally
{
System.Threading.Interlocked.Exchange(ref IsMigrating, 0);
}
}
}
catch (System.Data.Entity.Migrations.Infrastructure.AutomaticDataLossException ex)
{
Elmah.ErrorLog.GetDefault(null).Log(new Elmah.Error(ex));
}
catch (Exception ex)
{
Elmah.ErrorLog.GetDefault(null).Log(new Elmah.Error(ex));
}
}