EF Code First 未初始化数据库

Posted

技术标签:

【中文标题】EF Code First 未初始化数据库【英文标题】:EF Code First not initializing database 【发布时间】: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,则不会发生初始化。

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

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

【问题讨论】:

【参考方案1】:

哞,

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

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

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

【讨论】:

以上是关于EF Code First 未初始化数据库的主要内容,如果未能解决你的问题,请参考以下文章

EF Code First 初始化数据库

EF Code-First 学习之旅 数据库初始化

EF Code-First 学习之旅 数据库初始化

ef4.4 code first数据库新增时 初始化表数据不成功

EF6 学习笔记:Code First 方式生成数据库及初始化数据库实际操作

20.翻译系列:Code-First中的数据库迁移技术EF 6 Code-First系列