我有一个 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 });
}
}
引导静态类如下所示:
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,则不会发生初始化。
上述所有代码行都遇到断点,因此不会立即跳过任何内容 - 唯一未命中的断点是初始化程序中的种子方法,因此甚至没有被调用(如果初始化,这并不奇怪没有发生!)。
在这一点上,我没有想法 - 一切都按照它应该的方式设置,但没有发生数据库初始化。