2013-01-24 30 views
1

我在我的global.asax文件中有兩個數據庫初始化程序。EF5和簡單成員數據庫初始化問題

一個應創建我的數據庫的相關表,第二個初始化簡單成員所需的所有表。

我遇到的問題是,應該創建我的數據庫的第一個初始化方法,沒有做任何事情(至少看起來是這樣)。簡單的會員初始化工作正常。

只有在我的存儲庫類中創建了上下文的新實例時,纔會創建我想從我的上下文創建的表。然後這失敗了,因爲它試圖創建一個已經存在的用戶配置文件表,因爲WebSecurity.InitialiseDatabaseConnection初始化器已經創建了它?

任何想法爲什麼第一個數據庫初始化程序沒有被執行,直到在存儲庫方法中創建上下文爲止?

該數據庫是一個SQL Server LocalDB。

這裏是我的Application_Start方法Global.asax.cs

protected void Application_Start() 
{ 
    Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyContext, Configuration>()); 
    WebSecurity.InitializeDatabaseConnection("MyDb", "UserProfile", "UserId", "UserName", autoCreateTables: true); 

    AreaRegistration.RegisterAllAreas(); 

    WebApiConfig.Register(GlobalConfiguration.Configuration); 
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
    RouteConfig.RegisterRoutes(RouteTable.Routes); 
    BundleConfig.RegisterBundles(BundleTable.Bundles); 
    AuthConfig.RegisterAuth(); 

    ViewEngines.Engines.Clear(); 
    ViewEngines.Engines.Add(new RazorViewEngine()); 
} 

這裏的上下文類:

public class MyContext : DbContext 
{ 
    public MyContext() 
     : base("name=MyDb") 
    { 


    } 

    public DbSet<MyEntity> myEntity{ get; set; } 
    public DbSet<UserProfile> UserProfiles { get; set; } 

} 

而這裏的倉庫方法:

using (var db = new MyContext()) 
{ 

    var user = _userRepository.GetUserByUserName(userName); 

    db.UserProfiles.Attach(user); 

    if (rack.Id == 0) 
    { 
     rack.DateAdded = DateTime.Now; 
     rack.AddedBy = user; 

     db.MyEntity.Attach(rack); 
     db.Entry(rack).State = EntityState.Added; 
     db.SaveChanges(); 
    } 
    else 
    { 
     db.MyEntity.Attach(rack); 
     db.Entry(rack).State = EntityState.Modified; 
     db.SaveChanges(); 
    } 
} 

編輯:我已經移動了SimpleMem我的配置類的種子方法,如下所示,雖然這解決了正確的順序創建表的問題,但我仍然不明白爲什麼當初始化程序被調用時數據庫沒有被初始化該Application_Start方法

protected override void Seed(RackTrackContext context) 
    { 
     WebSecurity.InitializeDatabaseConnection("MyDb", "UserProfile", "UserId", "UserName", autoCreateTables: true); 

     if (!Roles.RoleExists("Administrator")) 
      Roles.CreateRole("Administrator"); 

     if (!WebSecurity.UserExists("User1")) 
      WebSecurity.CreateUserAndAccount(
       "User1", 
       "CodeMonkey" 
       ); 

     if (!Roles.GetRolesForUser("User1").Contains("Administrator")) 
      Roles.AddUsersToRoles(new[] { "User1" }, new[] { "Administrator" }); 
    } 

編輯NO2:

爲了得到它的工作,我已經創建使用在Application_Start方法新的上下文,並從數據庫中檢索結果。然後,在我希望應用這些遷移的階段應用遷移。

它很凌亂,它很醜,並且不會獲得任何獎項,但是嘿它有效,並且在做這件事時沒有動物受到傷害,所以它就會消失。

protected void Application_Start() 
    { 
     Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyContext, Configuration>()); 

     //this code is here to ensure that the context is created and migrations applied, 
     //prior to the user seeing the start screen for the app. Must be a better way of doing it.... 
     using (var db = new MyContext()) 
     { 
      var results = db.MyEntity.FirstOrDefault(); 
     } 

如果有人可以告訴我更好的方法,那麼有一些代表搶購!取而代之的

using (var db = new MyContext()) 
    { 
     var results = db.MyEntity.FirstOrDefault(); 
    } 

回答

0

嘗試

new MyContext().Database.Initialize(false) 
if (!WebSecurity.Initialized) 
    WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);