2015-04-23 10 views
5

Ich verwende Entity Framework 6 mit diesem DbMigrationsConfiguration:Entity Framework: Nur Seed beim Bau anfängliche Datenbank

public sealed class Configuration : DbMigrationsConfiguration<DataContext> 
{ 
    public Configuration() 
    { 
     AutomaticMigrationsEnabled = true; 
    } 

    protected override void Seed(Danfoss.EnergyEfficiency.Data.DataContext context) 
    { 
     //Adding initial data to context 

     context.SaveChanges(); 
    } 

} 

ich es in WebAPI auf diese Weise bin mit:

public static void Register(HttpConfiguration config) 
{ 
    Database.SetInitializer(new MigrateDatabaseToLatestVersion<DataContext, Configuration>()); 
} 

Ich habe festgestellt, dass die Funktion Seed jedes Mal ausgeführt wird, wenn meine Anwendung gestartet wird. Wie kann ich das verhindern? Ich mag es nur, wenn es zum ersten Mal ausgeführt wird, wenn es die anfänglichen Tabellen erstellt.

+0

In meinen Projekten verwende ich stattdessen ['AddOrUpdate'] (https://msdn.microsoft.com/en-us/library/hh846514%28v=vs.103%29.aspx). Etwas wie 'context.Table.AddOrUpdate (entity => entity.Id, neue Entität {Id = 1});'. Funktioniert das? – Default

+0

Ich mache das auch. Aber meine Seed-Methode enthält viele Daten, einschließlich CSV-Import. Das mag ich nicht jedes Mal, wenn ich meine Bewerbung starte. – dhrm

+0

Sie können eine Einstellungstabelle mit einem Bitwert haben, der angibt, ob die Datenbank gesetzt wurde oder nicht, und dann mit diesem Wert handeln, wenn die Startmethode gestartet wird, z. Sie kommen sofort zurück, wenn Sie herausgefunden haben, dass der Samen bereits verwendet wurde. – Santhos

Antwort

4

Die Methode DbMigrationsConfiguration.Seed wird jedes Mal aufgerufen, wenn Sie Update-Database anrufen. Die Begründung dafür ist in diesem Blog von One Unicorn erläutert.

Das bedeutet, dass Sie Ihren Seed Code schreiben müssen, um mit vorhandenen Daten fertig zu werden. Wenn Sie das nicht mögen, können Sie unter CodePlex für eine Änderung abstimmen.

In der Zwischenzeit den Blog zu zitieren:

Der beste Weg, dies zu umgehen ist in der Regel nicht AddOrUpdate jede Einheit für zu verwenden, sondern stattdessen mehr als beabsichtigt, über die Datenbank für bestehende Datenprüfung Verwenden Sie alle geeigneten Mechanismen. Zum Beispiel könnte Seed prüfen, ob nicht eine repräsentative Einrichtung existiert und dann auf dem Ergebnis verzweigen entweder aktualisieren alles oder alles

Eine weitere Option einfügen, dass ich in der Vergangenheit verwendet haben, steht hinzufügen Daten, die zu einer Migration in der Migration selbst gehören, mit dem Befehl Sql. So läuft es nur einmal. Ich habe mich davon entfernt, weil ich es vorziehe, die Saat an einem Ort zu behalten.

Verwandte Themen