Odpowiedz

50

Najlepszym sposobem jest użycie nowego inicjalizatora MigrateDatabaseToLatestVersion.

Database.SetInitializer<YourContext>(
    new MigrateDatabaseToLatestVersion<YourContext, YourMigrationsConfig>()); 
Database.Initialize(false); 
+4

Gdzie ten kod ma zostać umieszczony? Nie można używać Database.Initialize w App_Start, ponieważ nie można go użyć w statycznym kontekście. –

+0

@ MaximV.Pavlov: Spróbuj dodać go do konstruktora statycznego w twoim kontekście. –

+0

@ LadislavMrnka: jaki jest cel 'Database.Initialize (false);'? Z moich testów z 'MigrateDatabaseToLatestVersion', baza danych jest tworzona, rozstawiana i aktualizowana do najnowszej wersji bez tego drugiego Inicjowania połączenia. (w EF5 ...) – demoncodemonkey

6

Wielki opis opcji konfiguracyjnych EF 4.3 można znaleźć na stronie EF 4.3 Configuration File Settings na blogu zespołu ADO.NET. W ostatniej sekcji opisano inicjatory bazy danych, w tym nowy inicjator Code First MigrateDatabaseToLatestVersion.

Mimo że Entity Framework - podobnie jak wiele innych funkcji .NET 4.x - preferuje konwencję nad konfiguracją, jest to jeden z przypadków, w którym może być bardzo przydatne ustawienie inicjatora bazy danych MigrateDatabaseToLatestVersion poprzez plik konfiguracyjny aplikacji, a nie jawny kod do twojej aplikacji.

+0

Podczas korzystania z konfiguracji zwróć także uwagę na mój komentarz do tego posta, aby konfiguracja była bardziej czytelna. – Rudi

4

Musiałem to zrobić jawnie, ponieważ używam kontekstu uber do migracji, będącego nadzbiorem innych migracji. Kluczem bit jest:

var dbMigrator = new System.Data.Entity.Migrations.DbMigrator(
    new Lcmp.EF.Migrations.Migrations.Configuration()); 
dbMigrator.Update(); 

Z odrobiną rejestrowania ELMAH, właściwie to wykorzystać, zwany od Application_Start(). Kawałki tego są skradzione pomysłom innych. Nie jestem przekonany, że konieczna jest blokada z gwintem.

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)); 
    } 
} 
Powiązane problemy