我有一個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,不動初始化發生。
所有上述代碼行都會觸發斷點,因此不會立即跳過 - 唯一沒有命中的斷點是初始化器中的種子方法,因此甚至不會被調用(這不是被稱爲「如果初始化沒有發生,那麼就會令人驚訝!)。
在這一點上,我的想法 - 一切都建立了,因爲它看起來像它應該的,但沒有數據庫初始化正在發生的事情。