Quelle est la meilleure façon d'exécuter toutes les migrations de données nécessaires au démarrage de l'application avec EF 4.3 ?
Réponses
Trop de publicités?Une excellente description des options de configuration d'EF 4.3 est disponible à l'adresse suivante EF 4.3 Paramètres du fichier de configuration sur le blog de l'équipe ADO.NET. La toute dernière section décrit les initialisateurs de base de données, y compris le nouveau code First. MigrateDatabaseToLatestVersion
initialisateur.
Bien qu'Entity Framework, comme tant d'autres fonctionnalités de .NET 4.x, privilégie les conventions par rapport à la configuration, il s'agit d'un cas où il peut être très utile de définir l'attribut MigrateDatabaseToLatestVersion
par le biais du fichier de configuration de votre application plutôt que de le coder explicitement dans votre application.
J'ai dû le faire explicitement, car j'utilise un uber-contexte pour la migration, un superset des autres migrations. Le point clé est :
var dbMigrator = new System.Data.Entity.Migrations.DbMigrator(
new Lcmp.EF.Migrations.Migrations.Configuration());
dbMigrator.Update();
Avec un soupçon de journalisation Elmah, j'utilise en fait ceci, appelé depuis Application_Start(). Des parties de ce programme ont été volées aux idées d'autres personnes. Je ne suis pas sûr que la partie "thread-safety Interlocked" soit nécessaire.
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));
}
}