1

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

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

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

4

1 回答 1

0

哞,

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

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

如果没有别的,它的另一个想法。

于 2013-02-28T15:00:14.033 回答