2012-11-09 13 views
12

Il metodo Seed() non viene mai chiamato. Viene chiamato quando faccio un Update-Database dalla Console Gestione pacchetti, ma mai quando corro dal codice. Se cancello il mio database, tutte le tabelle sono create (quindi le mie classi di migrazione sono eseguite), ma il mio codice Seed() non viene mai chiamato. MVC 4, Entity Frame Work 5 Code First.Il metodo My Seed() non viene mai chiamato 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.... 
} 

Configurazione:

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 
} 

Cosa potrebbe esserci di sbagliato?

+2

Sei sicuro di fare qualcosa con il contesto? DbContext è pigro; non fa molto di nulla finché non lo usi, ad esempio, eseguendo una query o aggiungendo un oggetto. L'inizializzatore verrà eseguito solo quando il contesto viene utilizzato per la prima volta. È possibile provocare l'inizializzazione chiamando context.Database.Initialize (false); –

+0

Ho lo stesso problema, anche se non ho la stessa configurazione (mi affido all'esperienza fuori dalla scatola). Ho provato a eseguire context.database.Inizializza (false) con vero e falso, ma nessuno dei due ha causato l'esecuzione del metodo seed. – Noel

+0

@ArthurVickers Sì, ne sono sicuro. –

risposta

15

Quindi la ragione era che avevo bisogno di specificare mia abitudine Initializer nel file di configurazione:

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

Dopo di che, il mio metodo Seed viene chiamato.

+0

grazie a chi ha aiutato –

+0

Database.SetInitializer (nuova MigrateDatabaseToLatestVersion ()); /* nel tuo contesto il costruttore funziona anche */ –

5

Fare innanzitutto riferimento alla risposta accettata.
Voglio solo aggiungere una nota molto importante a questo problema.

Mi trovavo di fronte ESATTAMENTE lo stesso problema descritto da questa domanda (e questo mi porta a qui). MA stavo usando CreateDatabaseIfNotExists anziché MigrateDatabaseToLatestVersion e il mio metodo seed non è stato eseguito anche dopo aver applicato la risposta accettata.

Il mio problema era il seguente: Secondo il documentation of the for the Seed method: il metodo del DbMigrationsConfigurationSeed non verrà eseguita se il database Initializer è una delle seguenti

Se si utilizza uno di questi tipi, è necessario creare la propria classe che eredita da uno di questi tipi e quindi sovrascrivere il metodo seme nella propria classe.

Nel mio caso, l'aggiunta della classe seguente ha risolto il problema.

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

Ecco cosa non sto capendo: quando non utilizzeresti una di queste classi? Stavo seguendo un esempio in un libro che affermava usando 'DropCreateDatabaseIfModelChanges' che creava il mio database, e successivamente lo cambiavo in un' NullDatabaseInitializer' e un 'DbMigrationsConfiguration' per il seeding. Tutto ha funzionato bene, ma ora sto scoprendo che il database non viene creato per altri sviluppatori. Così l'ho cambiato in "CreateDatabaseIfNotExists" e ora crea, ma non semina. Quindi 'DbMigrationsConfiguration' è concepito solo per l'uso nei confronti di un db non creato da EF? – xr280xr

Problemi correlati