EF Code First不初始化数据库

时间:2013-02-08 14:24:01

标签: ef-code-first code-first entity-framework-5

我有一个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,则不会发生启动。

所有上面的代码行都会遇到断点,因此没有立即跳过 - 唯一没有命中的断点是初始值设定项中的种子方法,所以甚至没有被调用(这不是如果初始化没有发生,我会感到惊讶!)。

此时,我没有想法 - 所有内容都设置为它应该是,但没有数据库初始化。

1 个答案:

答案 0 :(得分:0)

武,

即使拨打InitialiseDataAccessLayer()的电话看起来正确,看似正确拨打Database.SetInitializer(new DropCreateDatabaseWithSeedData());,也可以尝试从Database.SetInitializer(new DropCreateDatabaseWithSeedData());直接拨打ApplicationStart

它不会实例化你的UnitOfWork,但我不确定你是否需要这样做,因为你正在播种。

如果没有别的,那就是另一个想法。