2013-06-20 4 views
1

Я пытаюсь засеять свое приложение некоторыми тестовыми данными через EF-код. Сначала, когда приложение запускается.ASP.NET MVC 3 - класс DBContext не выполняется

Вот что я наблюдаю:

Когда я запустить приложение, выполнение переходит в:

Application_Start() {} 

А потом один раз в Application_Start() приземляется на:

Database.SetInitializer<LocatorContext>(new DropCreateDatabaseAlways<LocatorContext>()); 

Но он никогда не попадает в класс DBContext (ClubLocatorContext.cs), , где происходит посев, амон g другие вещи.

Любые мысли о том, почему и как я могу это исправить, будут высоко оценены.

Мои Global.asax.cs Файл

//Global.asax.cs 
protected void Application_Start() 
{ 
    Database.SetInitializer<LocatorContext>(new DropCreateDatabaseAlways<LocatorContext>()); 

    AreaRegistration.RegisterAllAreas(); 
    RegisterGlobalFilters(GlobalFilters.Filters); 
    RegisterRoutes(RouteTable.Routes); 
} 

Мой 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<Prospect> Prospects { get; set; } 

     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      base.OnModelCreating(modelBuilder); 
      modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 
     } 

     public void Seed(LocatorContext context) 
     { 
      var prospect = new List<Prospect> 
         { 
           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<LocatorContext> 
     { 
      protected override void Seed(LocatorContext context) 
      { 
       context.Seed(context); 
       base.Seed(context); 
      } 
     } 

     public class CreateInitializer : DropCreateDatabaseAlways<LocatorContext> 
     { 
      protected override void Seed(LocatorContext context) 
      { 
       context.Seed(context); 
       base.Seed(context); 
      } 
     } 

     static LocatorContext() 
     { 
      #if DEBUG 
      Database.SetInitializer<LocatorContext> (new DropCreateIfChangeInitializer()); 
      #else 
      Database.SetInitializer<LocatorContext> (new CreateInitializer()); 
      #endif 
     } 
    } 
} 
+0

Это просто установка инициализатору, не инициализируются. При доступе к базе данных он будет создавать базу данных и данные семени. –

+0

Джейсон, спасибо. Что бы это выглядело изнутри Application_Start() :? – Slinky

ответ

1
new DropCreateIfChangeInitializer() 
       .InitializeDatabase(new LocatorContext()); 
+0

Джейсон, я вижу, что этот метод в моем контексте, но intellisense в VS не любит этот синтаксис. Можете ли вы показать мне, как это должно выглядеть изнутри Application_Start()? Спасибо – Slinky

+0

Вы создали DropCreateIfChangeInitializer, который расширяет DropCreateDatabaseIfModelChanges , который имеет открытый метод InitializeDatabase. Поэтому я не понимаю, почему вы не можете вызвать метод в Application_Start. –

+0

Странно. Единственные 2 методы, которые приходят в IntelliSense являются DropCreateDatabaseAlways <> и Slinky