2013-02-08 121 views
1

我有一個EF代碼第一次的DbContext,自定義初始化它的種子數據,並且將在Global.asax中的一部分的Application_Start初始化自舉靜態類。EF代碼第一次不進行初始化數據庫

的初始化是這樣的:

public class DropCreateDatabaseWithSeedData : DropCreateDatabaseAlways<MyEntities> 
{ 
    protected override void Seed(MyEntities context) 
    { 
     context.Genders.Add(new Gender { Id = 1, Name = "Male", SortOrder = 1 }); 
     context.Genders.Add(new Gender { Id = 2, Name = "Female", SortOrder = 2 }); 
     context.Genders.Add(new Gender { Id = 3, Name = "Prefer not to say", SortOrder = 3 }); 
    } 
} 

自舉靜態類的樣子:

public static class Bootstrap 
{ 
    public static void InitialiseDataAccessLayer() 
    { 
     Database.SetInitializer(new DropCreateDatabaseWithSeedData()); 
     var uow = new UnitOfWork(); 
     uow.Context.Database.Initialize(force: true); 
    } 
} 

在Global.asax的Application_Start樣子:

protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     RegisterGlobalFilters(GlobalFilters.Filters); 
     RegisterRoutes(RouteTable.Routes); 

     ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory()); 

     DataAccess.Infrastructure.Bootstrap.InitialiseDataAccessLayer(); 
    } 

一切看起來,因爲它應該,但是沒有數據庫初始化發生 - 如果我運行沒有預先存在的數據庫的應用程序在所有的,我得到一個異常的SqlClient:

A System.Data.SqlClient.SqlException was thrown: "Cannot open database MyEntities requested by the login. The login failed. Login failed for user 'localdev'." 

用戶localdev具有完全訪問SQL Server的,我可以登錄到與SSMS的SQL Server和創建,刪除,更新等數據庫的罰款。

如果我運行一個現有的,但空數據庫的應用程序,應用程序試圖運行它可以在第一個查詢(在這種情況下,一些用戶驗證查詢)失敗的「無效的對象」的例外,因爲它試圖查詢不存在的表格。

如果我運行uow.Context.Database.Create(),沒有現有的數據庫,的確是創建數據庫,但沒有種子數據插入。

如果我改變初始化到DropCreateDatabaseAlways,不動初始化發生。

所有上述代碼行都會觸發斷點,因此不會立即跳過 - 唯一沒有命中的斷點是初始化器中的種子方法,因此甚至不會被調用(這不是被稱爲「如果初始化沒有發生,那麼就會令人驚訝!)。

在這一點上,我的想法 - 一切都建立了,因爲它看起來像它應該的,但沒有數據庫初始化正在發生的事情。

回答

0

哞,

即使調用InitialiseDataAccessLayer()看起來有什麼看起來像一個正確調用Database.SetInitializer(new DropCreateDatabaseWithSeedData());正確嘗試從ApplicationStartDatabase.SetInitializer(new DropCreateDatabaseWithSeedData());直接調用。

它不會實例化UnitOfWork,但我不知道,你需要做的,在這個時候,因爲你是播種。

如果不出意外,它的另一個想法。