Database di seed all’avvio dell’applicazione – ASP MVC 3 e EF

Per qualche motivo non riesco a far sì che la mia applicazione semina il database con alcuni dati di test all’avvio dell’applicazione.

Ordine di esecuzione:

1) Application_Start() in Global.asax - Database.SetInitializer(new DropCreateDatabaseAlways()); - new LocatorContext.DropCreateIfChangeInitializer() .InitializeDatabase(new LocatorContext()); 2) onModelCreating() in my DBContext class 3) Page is rendered and no data is inserted into the database 

Qualche idea sul perché o su come posso risolverlo sarebbe molto apprezzata.

Il mio file Global.asax.cs

 //Global.asax.cs protected void Application_Start() { Database.SetInitializer(new DropCreateDatabaseAlways()); AreaRegistration.RegisterAllAreas(); RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(RouteTable.Routes); } 

La mia class DBContext

 //ClubLocatorContext.cs using System; using System.Collections.Generic; using System.Data.Entity.ModelConfiguration.Conventions; using System.Linq; using System.Web; using System.Data.Entity; using System.Data.Entity.Infrastructure; using ClubLocator.Models; using ClubLocator.Models.ViewModels; namespace ClubLocator.DAL { public class LocatorContext : DbContext { public DbSet Prospects { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Conventions.Remove(); } public void Seed(LocatorContext context) { var prospect = new List { new Prospect { FirstName = "John", LastName = "Smith", Address1 = "1313 Mockingbird Lane", Email = "[email protected]" } }; prospect.ForEach(r => context.Prospects.Add(r)); context.SaveChanges(); } public class DropCreateIfChangeInitializer : DropCreateDatabaseIfModelChanges { protected override void Seed(LocatorContext context) { context.Seed(context); base.Seed(context); } } public class CreateInitializer : DropCreateDatabaseAlways { protected override void Seed(LocatorContext context) { context.Seed(context); base.Seed(context); } } static LocatorContext() { #if DEBUG Database.SetInitializer (new DropCreateIfChangeInitializer ()); #else Database.SetInitializer (new CreateInitializer ()); #endif } } } 

Prima di tutto, tutto il tuo codice EF sembra a posto.

Il problema è che hai inizializzato il tuo database. Altrimenti EF aspetterà finché non lo accederai in qualche modo per inizializzarlo.

Puoi navigare il tuo sito web quanto vuoi senza che il database sia avviato, se nessuna delle pagine accede ai dati.

Se vuoi forzare l’inizializzazione del database all’avvio dell’applicazione, fai qualcosa di simile a questo:

 using (var db = new LocatorContext()) { db.Database.Initialize(true); } 

Di solito creo una class statica come:

 public static class LocatorInitializationHandler { public static void Initialize() { // if you want to use your initializer Database.SetInitializer(new CreateInitializer()); using (var db = new LocatorContext()) { db.Database.Initialize(true); } } } 

Quale posso quindi chiamare da App_start:

 //Global.asax.cs protected void Application_Start() { LocatorInitializationHandler.Initialize(); AreaRegistration.RegisterAllAreas(); RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(RouteTable.Routes); }