Entity framework 是否需要base.OnModelCreating(modelBuilder)?

Entity framework 是否需要base.OnModelCreating(modelBuilder)?,entity-framework,entity-framework-6,Entity Framework,Entity Framework 6,我正在重写OnModelCreating,方法中有一行base.OnModelCreating(modelBuilder) 查看如何实现这一点的代码示例和手册,我对是否需要它感到困惑。有时它在那里,有时不在。有时在方法开始时,有时在方法结束时 我应该如何处理它呢?根据,直接从DbContext类继承并不重要: 当派生上下文的模型已初始化时,但在锁定模型并用于初始化上下文之前,调用此方法此方法的默认实现不执行任何操作,但可以在派生类中重写它,以便在锁定模型之前对其进行进一步配置 换句话说,由于is

我正在重写
OnModelCreating
,方法中有一行
base.OnModelCreating(modelBuilder)

查看如何实现这一点的代码示例和手册,我对是否需要它感到困惑。有时它在那里,有时不在。有时在方法开始时,有时在方法结束时

我应该如何处理它呢?

根据,直接从
DbContext
类继承并不重要:

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

换句话说,由于is根据定义不做任何事情,因此调用
base.OnModelCreating
是不必要的,但同时如果调用它也不会有任何影响-这就是为什么有时它存在,有时不存在的原因。有时在方法的开头,有时在方法的结尾。

这里说的是

目前这并不重要。模型创建和种子 方法没有任何实现(即 函数在其基类中为空。因此呼吁 基类基本上是禁止的。我不认为有任何计划 更改它(特别是种子方法-我们如何知道要使用哪些数据) 放入数据库?)

一般来说,受保护的方法可以在base中有一些实现 上课。在这种情况下,这取决于从 这样的班级决定他/她是否愿意利用 方法中提供的功能是否在基类中。如果 开发人员认为,他/她只想向 该方法在其将调用的基类中提供的功能 这是一种新的方法。否则,他/她不会调用 基类,并将在 方法对派生类执行


参考:

我刚刚开始了一个ASP.NET MVC5项目,基于这个线程,我将“base.OnModelCreating(modelBuilder)”注释掉。 然后,我想更新EF6标准DbContext的表名等,在执行“添加迁移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)”的注释,这使它能够按预期工作


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

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

我明白了。尽管如此,当它什么都不做时,为什么还要叫它呢?我的意思是,我知道覆盖提供了modelBuilder,我们可以在其中放置进一步的配置。但为什么要呼叫基地?或者换句话说,我们传递给它的modelBuilder发生了什么。听起来都是。。。无用:-)这就是重点。当您有一个基本的
virtual
方法时,必须有一些文档来解释重写该方法时调用该方法的要求,例如是否需要调用它,是否需要在开始或结束时调用它。这里的文档说明该方法不做任何事情,因此没有要求-如果您愿意,可以在覆盖的任何位置调用它,或者根本不能调用它。一旦您知道它在定义上什么都不做,您可能就不会称它为:)在OO中,您调用基类以确保满足其声明的行为。不管这种行为是什么。你不需要详细了解base做了什么。也许有一天,它决定做些别的什么,然后什么也不做,或者以不同的方式什么也不做。因此我称之为。但是,放在第一位还是最后一位的问题仍然存在。它是使用ASP.Net标识的ASP.Net项目所必需的。@BenjaminRay是的,它是-当您继承一些
IdentityDbContext
基类时。这里我要说的是
DbContext
类。每个用作基类的派生类都应该定义是否需要基类调用,以及是在重写代码之前还是之后。唯一重要的是官方文档中说了什么(如果它是错误的,那么这是一个必须报告和修复的错误-这里显然不是这样)。嗯……这里两者都是一样的:D@ivanstoev您是从
DbContext
还是
IdentityDbContext
继承的?这可能会有所不同。@Sinjai:在这个项目中,我继承了
IdentityDbContext
。最后,这个类继承自
DbContext
,其中定义了
OnModelCreating
,因此我仍然不完全清楚它的用途,但是如果迁移需要它,那就是myst
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);
}