【问题标题】:EF Code First not initializing databaseEF Code First 未初始化数据库
【发布时间】:2013-02-08 14:24:00
【问题描述】:

我有一个 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,则不会发生初始化。

以上所有代码行都遇到断点,因此不会立即跳过任何内容 - 唯一未命中的断点是初始化程序中的种子方法,因此甚至没有被调用(这不是如果初始化没有发生,那就太令人惊讶了!)。

在这一点上,我没有想法 - 一切都按照它应该的方式设置,但没有进行数据库初始化。

【问题讨论】:

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


    【解决方案1】:

    哞,

    尽管对InitialiseDataAccessLayer() 的调用看起来正确,而对Database.SetInitializer(new DropCreateDatabaseWithSeedData()); 的调用看起来是正确的,但尝试从ApplicationStart 直接调用Database.SetInitializer(new DropCreateDatabaseWithSeedData());

    它不会实例化您的UnitOfWork,但由于您正在播种,我不确定您此时是否需要这样做。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-08
      • 2016-11-06
      • 2015-08-07
      • 2016-08-22
      • 2014-03-07
      • 1970-01-01
      相关资源
      最近更新 更多