我覆盖OnModelCreating
,在方法中有base.OnModelCreating(modelBuilder);
行
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
}
查看有关如何实现此问题的代码示例和手册,我感到很困惑,不管是否需要它。有时它会在那里,有时候不会。有时在方法开始时,有时在结束时。
我该怎么办?
答案 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)”,这一切都按预期进行。
我还没有找到确切的原因,但是在某些情况下,这行代码似乎是必需的。