2012-11-09 4 views
12

Meine Seed() Methode wird nie aufgerufen. Es wird aufgerufen, wenn ich eine Update-Database von der Package Manager Console, aber nie, wenn ich von Code ausführen. Wenn ich meine Datenbank lösche, werden alle Tabellen erstellt (also werden meine Migrationsklassen ausgeführt), aber mein Seed() - Code wird nie aufgerufen. MVC 4, Entity Frame Work 5 Code zuerst.Meine Seed() -Methode wird nie aufgerufen in Code First EF 5

Global.asax:

protected void Application_Start() 
{ 
    Database.SetInitializer<MyContext>(new DbInitializer()); 
} 

dbinit:

internal class DbInitializer : MigrateDatabaseToLatestVersion<MyContext, Migrations.Configuration> 
{ 
} 

DbContext:

public partial class MyContext : DbContext 
{ 
    public MyContext() : base("DefaultConnection") 
    { 
    } 
    // public DBSets.... 
} 

Konfiguration:

internal sealed class Configuration : DbMigrationsConfiguration<MyContext> 
{ 
public Configuration() 
{ 
    // The constructor is actually called 
    AutomaticMigrationsEnabled = false; 
} 

protected override void Seed(MyContext context) 
{ 
    // My seed code, never called 
} 

Was könnte falsch sein?

+2

Sind Sie sicher, dass Sie etwas mit dem Kontext tun? DbContext ist faul; Es macht nicht viel von irgendetwas, bis Sie es zum Beispiel verwenden, indem Sie eine Abfrage ausführen oder ein Objekt hinzufügen. Ihr Initialisierer wird nur ausgeführt, wenn der Kontext zum ersten Mal verwendet wird. Sie können die Initialisierung veranlassen, indem Sie context.Database.Initialize aufrufen (false); –

+0

Ich habe das gleiche Problem, obwohl ich nicht ganz die gleiche Konfiguration habe (ich verlasse mich auf die Out-of-Box-Erfahrung) .Ich habe versucht, context.database auszuführen.Initialize (false) mit true und false, aber keiner von beiden hat zur Ausführung der seed-Methode geführt. – Noel

+0

@ArthurVickers Ja, da bin ich mir sicher. –

Antwort

15

So war der Grund, dass ich brauchte, um meinen benutzerdefinierten Initializer in der Konfigurationsdatei angeben:

<entityFramework> 
     <contexts> 
     <context type="EFTest2.MyContext, EFTest2"> 
      <databaseInitializer type="EFTest2.Initializers.DbInitializer, EFTest2" /> 
     </context> 
     </contexts> 
     <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> 
    </entityFramework> 

Danach wird meine Seed Methode aufgerufen.

+0

danke man es geholfen –

+0

Database.SetInitializer (neue MigrateDatabaseToLatestVersion ()); /* in Ihrem Kontext Konstruktor funktioniert auch */ –

5

Bitte beachten Sie zuerst die angenommene Antwort.
Ich möchte nur eine sehr wichtige Notiz zu diesem Problem hinzufügen.

Ich war konfrontiert GENAU das gleiche Problem, das durch diese Frage beschrieben (und das führte mich zu hier). Aber ich wurde mit CreateDatabaseIfNotExists statt MigrateDatabaseToLatestVersion und meine Samen Methode wurde nicht ausgeführt, auch nach der akzeptierten Antwort Anwendung.

Mein Problem war folgendes: Nach dem documentation of the for the Seed method: die Seed Methode des DbMigrationsConfiguration nicht, wenn die Datenbank ausgeführt werden Initializer eine der folgenden

Wenn Sie einen dieser Typen verwenden, sollten Sie Ihre eigene Klasse erstellen, die von einem dieser Typen erbt, und dann die Startmethode in Ihrer eigenen Klasse überschreiben.

In meinem Fall löste das Hinzufügen der folgenden Klasse das Problem.

public class CreateNotifierDatabaseIfNotExists : CreateDatabaseIfNotExists<NotifierContext> 
{ 
    protected override void Seed(NotifierContext context) 
    { 
     // the code of the seeding is go here 
    } 
} 
+0

Hier ist, was ich nicht verstehe: Wann würden Sie nicht eine dieser Klassen verwenden? Ich hatte ein Beispiel in einem Buch verfolgt, in dem "DropCreateDatabaseIfModelChanges" verwendet wurde, das meine Datenbank erstellte, und später für das Seeding in "NullDatabaseInitializer" und "DbMigrationsConfiguration" geändert wurde. Es hat alles gut funktioniert, aber jetzt finde ich heraus, dass die Datenbank nicht für andere Entwickler erstellt wird. Also habe ich es in 'CreateDatabaseIfNotExists' geändert und es wird nun erstellt, aber nicht seed. Also ist 'DbMigrationsConfiguration' nur zur Verwendung gegen eine db gedacht, die nicht von EF erstellt wurde? – xr280xr

Verwandte Themen