2013-06-20 38 views
1

我試圖通過EF Code First,在應用程序啓動時通過一些測試數據爲我的應用程序播種。ASP.NET MVC 3 - DBContext類未執行

這裏就是我觀察:

當我運行應用程序,執行進入:在的Application_Start(

Application_Start() {} 

再一次),它的土地上:

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

但它永遠不會進入播種發生的DBContext類(ClubLocatorContext.cs), , 其他事情。

任何想法,爲什麼或如何我可以修復它將不勝感激。

我的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

Jason,我在我的上下文類中看到該方法,但VS中的intellisense不喜歡該語法。你能告訴我它從Application_Start()裏面應該看起來像什麼嗎?謝謝 – Slinky

+0

您創建了DropCreateIfChangeInitializer,它擴展了具有公共方法InitializeDatabase的DropCreateDatabaseIfModelChanges 。所以我不明白你爲什麼不能調用Application_Start中的方法 –

+0

這很奇怪。唯一的方法2過程中出現的智能感知是DropCreateDatabaseAlways <>和DropCreateDatabaseIfModelChanges <> – Slinky