我有一个EF Code First DbContext,一个种子数据的自定义初始化程序,以及一个在Global.asax的Application_Start部分设置初始化程序的引导程序静态类。
初始值设定项如下:
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 });
}
}
bootstrap静态类看起来像:
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 :(得分:0)
武,
即使拨打InitialiseDataAccessLayer()
的电话看起来正确,看似正确拨打Database.SetInitializer(new DropCreateDatabaseWithSeedData());
,也可以尝试从Database.SetInitializer(new DropCreateDatabaseWithSeedData());
直接拨打ApplicationStart
。
它不会实例化你的UnitOfWork
,但我不确定你是否需要这样做,因为你正在播种。
如果没有别的,那就是另一个想法。