2016-03-15 12 views
7

Ich versuche, meine Datenbank automatisch zu generieren, wenn sie nicht existiert, und die Seed()-Methode zum Auffüllen der Daten auszuführen. In meiner Datenbank Context Konstruktor habe ich dies:MigrateDatabaseToLatestVersion keine laufende Seed() -Methode

Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDBContext, Configuration>()); 

Dieses große Werk, meine Datenbank automatisch mit allen Tabellen erstellt, wie ich will, aber es scheint, wie die Seed() Methode nicht aufgerufen wird, meine Datenbank leer ist. Das ist meine Klasse:

internal sealed class Configuration : DbMigrationsConfiguration<Context.MyDBContext> 
{ 

    public Configuration() 
    { 
     AutomaticMigrationsEnabled = true; 
    } 

    protected override void Seed(Context.MyDBContext context) 
    { 
     context.Users.AddOrUpdate(
      new Entities.User() { Email = "[email protected]", Password = "", Language = "en", CreatedDate = DateTime.Now } 
     ); 

     base.Seed(context); 
    } 
} 

Als ich Update-Database in der Nuget Konsole laufen die Daten nach der Erstellung der Datenbank gefüllt wird, aber mit MigrateDatabaseToLatestVersion die Seed() Methode wird nicht aufgerufen.

Was kann passieren? Ich habe versucht, Migration manuell ausgeführt wird, wie aus here genommen:

var configuration = new MyDbContextConfiguration(); 
configuration.TargetDatabase = new DbConnectionInfo(
    database.ConnectionString, database.ProviderName); 

var migrator = new DbMigrator(configuration); 
migrator.Update(); 

aber auch nicht funktioniert.


EDIT:

Ok, nach einiger mehr Tests fand ich, dass die Seed() Verfahren läuft, aber nur, wenn die Datenbank bereits vorhanden ist, das heißt, auf dem ersten Lauf, wenn die Datenbank für die erstellt wird, Zum ersten Mal die Seed() Methode wird nicht ausgeführt, aber wenn ich meine App zum zweiten Mal Seed() ausführen ausgeführt. Ich hatte auch context.SaveChanges() hinzuzufügen, um für sie (dank @DavidG in den Kommentaren) zu arbeiten:

protected override void Seed(Context.MyDBContext context) 
    { 
     context.Users.AddOrUpdate(
      new Entities.User() { Email = "[email protected]", Password = "", Language = "en", CreatedDate = DateTime.Now } 
     ); 

     context.SaveChanges(); 
     base.Seed(context); 
    } 

Vielleicht kann ich manuell Seed() innerhalb Configuration() rufen und tun einige Prüfung duplizieren Daten zu vermeiden das Hinzufügen oder Ändern von Daten das existiert schon.

+0

Funktioniert nicht nicht genug. Haben Sie versucht, mit einem Debugger zu arbeiten? Wird die Seed-Methode aufgerufen? Wenn dies der Fall ist, versucht das Problem möglicherweise, einen Benutzer auf diese Weise zu initialisieren. Benutze stattdessen UserManager –

+0

Kannst du eine Exception in die 'Seed'-Methode werfen, um zu überprüfen, ob die Seed-Methode überhaupt nicht ausgeführt wurde (und nicht einfach, dass der Benutzer nicht in die Datenbank eingefügt wurde?). – Rob

+0

Sie rufen nicht 'context.SaveChanges();' auf, nachdem Sie Ihre Benutzer hinzugefügt haben. – DavidG

Antwort

7

endete ich mit dieser Configuration Klasse bis:

public class Configuration : DbMigrationsConfiguration<Context.MyDBContext> 
    { 
     private readonly bool _pendingMigrations; 

     public Configuration() 
     { 
      AutomaticMigrationsEnabled = true; 

      // Check if there are migrations pending to run, this can happen if database doesn't exists or if there was any 
      // change in the schema 
      var migrator = new DbMigrator(this); 
      _pendingMigrations = migrator.GetPendingMigrations().Any(); 

      // If there are pending migrations run migrator.Update() to create/update the database then run the Seed() method to populate 
      // the data if necessary 
      if (_pendingMigrations) 
      { 
       migrator.Update(); 
       Seed(new Context.MyDBContext()); 
      } 
     } 

     protected override void Seed(Context.MyDBContext context) 
     { 
      // Microsoft comment says "This method will be called after migrating to the latest version." 
      // However my testing shows that it is called every time the software starts 

      // Run whatever you like here 

      // Apply changes to database 
      context.SaveChanges(); 
      base.Seed(context); 
     } 
    } 

So auf diese Weise die Seed() Methode aufgerufen wird, wenn die Datenbank und auch erstellt, wenn es ausstehende Migrationen.

Das ist mein MyDBContext Klasse:

public class MyDBContext: DbContext 
{ 
    public MyDBContext() : base(AppSettings.DBConnectionString) 
    { 
    } 

    public static MyDBContext Create() 
    { 
     return new MyDBContext(); 
    } 

    public DbSet<User> Users { get; set; } 
    public DbSet<Entries> Entries { get; set; } 
} 
+0

Ich habe das gleiche Problem, aber Ihre Lösung schafft Endlosschleife für mich. Um genau diesen Teil 'Seed (new Context.MyDBContext());' Es erstellen neue 'DbContext', die neue' Configuratio' erstellt, die neue 'DbContext' usw. erstellt, bis StackOverflow Ausnahme – Masius

+0

Siehe das Beispiel' MyDBContext' Klasse I der Antwort hinzugefügt. Für mich funktioniert es perfekt in einer Produktionsumgebung ohne Probleme. – Andres

+0

Wo 'Database.SetInitializer (neue MigrateDatabaseToLatestVersion ());' sollte jetzt aufgerufen werden - es fehlt im 'MyDbContext' Konstruktor? – pitersmx

Verwandte Themen