2013-01-09 13 views
12

Sto riscontrando un problema nel chiamare il metodo Seed sul mio inizializzatore del database personalizzato. Sto utilizzando EF 5.0 e hanno il seguente codice: esistonoDropCreateDatabaseAlways Seed non chiamato

public static class MyDatabase 
{ 
    public static void Initialize() 
    { 
     Database.SetInitializer(new MyInitializer()); 
    } 
} 

public class MyInitializer : DropCreateDatabaseAlways<MyContext> 
{ 
    protected override void Seed(MyContext context) 
    { 
     base.Seed(context); 
     context.Roles.Add(new Role 
     { 
      ID = 1, 
      Name = "User", 
     }); 
     context.Roles.Add(new Role 
     { 
      ID = 2, 
      Name = "Admin", 
     }); 
     context.SaveChanges(); 
    } 
} 

Queste due classi in una libreria di classe separata dalla app MVC. Nel Global.asax, chiamo il metodo Initialize():

MyDatabase.Initialize(); 

Il database viene creato bene, è solo il metodo Seed(MyContext context) non è chiamato e nessun dato viene messo nel mio database.

+0

Per curiosità, cosa succede se si mette la base. Alla fine del metodo? – IronMan84

+0

La stessa cosa, non viene chiamata. Metto un breakpoint sul contesto.Roles.Add e non si rompe mai. Avrebbe qualcosa a che fare con l'inizializzatore in una diversa libreria di classi e non nel progetto web stesso? Pensavo di averlo fatto in questo modo prima, ma non ricordo in modo specifico. –

+0

Potrebbe. Potrebbe anche essere che hai messo tutto in una classe statica. – IronMan84

risposta

1

Il metodo Seed verrà chiamato dopo aver inviato la prima query SQL al database, non nel numero Application_Start. Per esempio:

using (var ctx = new MyContext()) 
{ 
    var rolesCount = ctx.Roles.Count(); // should return 2 
} 
+0

Invio query al database. Questo posso confermare usando Intellitrace. Nel layout, sto compilando un menu a discesa con un elenco di dati sempre vuoto. Sto anche tentando di salvare un utente in un ruolo che non esiste. –

13

Il database verrà creato più avanti, quando si utilizza il contesto o Si può sempre forzarlo a creare utilizzando il contesto nel metodo Application Start() in Global.asax.cs come:

System.Data.Entity.Database.SetInitializer(new MyInitializer()); 
MyContext db = new MyContext(); 
db.Database.Initialize(true); 
+0

Non ho ancora avuto la possibilità di provarlo, ma quando lo farò ti farò sapere come va. Grazie per il suggerimento! –

Problemi correlati