是base.OnModelCreating(modelBuilder)必需吗?

时间:2016-09-19 14:53:36

标签: entity-framework entity-framework-6

我覆盖OnModelCreating,在方法中有base.OnModelCreating(modelBuilder);

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);
}

查看有关如何实现此问题的代码示例和手册,我感到很困惑,不管是否需要它。有时它会在那里,有时候不会。有时在方法开始时,有时在结束时。

我该怎么办?

4 个答案:

答案 0 :(得分:7)

根据documentation,如果您直接从DbContext类继承,则无关紧要:

  

在初始化派生上下文的模型时,但在锁定模型并用于初始化上下文之前,将调用此方法。 此方法的默认实现不执行任何操作,但可以在派生类中重写它,以便在锁定模型之前可以进一步配置模型。

换句话说,因为根据定义没有做任何事情,所以调用base.OnModelCreating不是必需的,但同时也不会因为被调用而受到伤害 - 这就是为什么有时它会在那里,有时候不会。有时在方法开始时,有时在结束时。

答案 1 :(得分:3)

这里的内容是Pawel Kadluczka - MSFT ...

  

目前这并不重要。 OnModelCreating和Seed   方法没有任何实施(即   函数是空的)在它们的基类中。因此呼唤   基类基本上是无操作。我不认为有任何计划   改变它(特别是对于种子方法 - 我们如何知道什么数据   放入数据库?)

     

一般来说,受保护的方法可以在base中有一些实现   类。在这种情况下,这取决于派生的开发人员   这样一个班级来决定他/她是否愿意利用   是否在基类中提供的功能。如果   开发人员认为他/她只想添加一些内容   由基类中的方法提供的功能s /他将调用   进入这种方法。否则他/她不会调用方法   基类,并将提供所有必需的功能   派生类的方法。

参考: Link

答案 2 :(得分:2)

当您覆盖创建时,您也会覆盖标识创建。如果您没有继承任何IdentityDbContext,则不需要它,但是如果您使用过Identity,则也必须调用该身份的实现。因此,使用base.OnModelCreating(builder);来调用身份的实现。因此,如果您覆盖身份的创建,则身份将丢失其配置。因此,您也可以运行基础以保留Identity的创建。

答案 3 :(得分:0)

我刚刚开始一个ASP.NET MVC5项目,并基于此线程,我将“ base.OnModelCreating(modelBuilder)”注释掉了。 然后,我想更新EF6标准DbContext的表名称等,并且在执行“ add-migration Abc”时,控制台不断向我抛出此错误:

  

在模型生成过程中检测到一个或多个验证错误:

     

xxx.Models.IdentityUserRole::EntityType'IdentityUserRole'没有定义键。定义此EntityType的键。   xxx.Models.IdentityUserLogin::EntityType'IdentityUserLogin'没有定义键。定义此EntityType的键。   IdentityUserRoles:EntityType:EntitySet'IdentityUserRoles'基于未定义键的'IdentityUserRole'类型。   IdentityUserLogins:EntityType:EntitySet'IdentityUserLogins'基于未定义键的'IdentityUserLogin'类型。

经过一番挣扎,我尝试取消注释“ base.OnModelCreating(modelBuilder)”,这一切都按预期进行。

我还没有找到确切的原因,但是在某些情况下,这行代码似乎是必需的。