我有一个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,不动初始化发生。
所有上述代码行都会触发断点,因此不会立即跳过 - 唯一没有命中的断点是初始化器中的种子方法,因此甚至不会被调用(这不是被称为“如果初始化没有发生,那么就会令人惊讶!)。
在这一点上,我的想法 - 一切都建立了,因为它看起来像它应该的,但没有数据库初始化正在发生的事情。