Entity Framework DbContext 使用错误的构造函数初始化

Posted

技术标签:

【中文标题】Entity Framework DbContext 使用错误的构造函数初始化【英文标题】:Entity Framework DbContext is initialized with wrong constructor 【发布时间】:2020-10-28 15:33:47 【问题描述】:

在我的 ASP.NET Core Web API 中,我将 DbContext 添加到服务中:

 services.AddDbContext<OpContext>(options =>  options.UseSqlServer(Configuration["DatabaseConnectionString"]));

问题是我的 dbcontext 作为三个构造函数:

 public partial class UppContext : DbContext
 
    public UppContext() : base()
     

    public UppContext(DbContextOptions<DbContext> options) : base(options) 
     

    public UppContext(IIdentificationService idService) : base()
    
        _idService = idService;
    

OpContext继承自上述:

public partial class OpContext : UppContext

    public OpContext() : base()  
    public OpContext(IIdentificationService idService) : base(idService)  

    public OpContext(DbContextOptions<DbContext> options) : base(options)    

它总是调用无参数构造函数,而不是使用选项调用。因此我的连接不起作用。

这是我在控制器中注入它的地方:

  public RequestController(OpContext dbContext)
    
        cxt = dbContext;
        persistenceManager = new OpPersistenceManager(dbContext);
    

这是实际的例外:

System.InvalidOperationException HResult=0x80131509 消息=否 已为此 DbContext 配置数据库提供程序。提供者 可以通过覆盖 DbContext.OnConfiguring 方法或 通过在应用程序服务提供者上使用 AddDbContext。如果 使用 AddDbContext,然后还要确保您的 DbContext 类型 在其构造函数中接受一个 DbContextOptions 对象,并且 将其传递给 DbContext 的基本构造函数。 源 = Microsoft.EntityFrameworkCore StackTrace:在 Microsoft.EntityFrameworkCore.Internal.DbContextServices.Initialize(IServiceProvider scopedProvider, IDbContextOptions contextOptions, DbContext context) 在 Microsoft.EntityFrameworkCore.DbContext.get_InternalServiceProvider() 在 Microsoft.EntityFrameworkCore.DbContext.get_ChangeTracker() 在 Breeze.Persistence.EFCore.EFPersistenceManager`1..ctor(T context) 在 Op.Authors.Api.Breeze.OpPersistenceManager..ctor(OpContext dbContext) 在 C:\dev\UPP\Source\Op\Op.Authors.Api\Breeze\OpPersistenceManager.cs:line 8 在 Op.Authors.Api.Controllers.RequestController..ctor(OpContext dbContext) 在 C:\dev\UPP\Source\Op\Op.Authors.Api\Controllers\RequestController.cs:line 21 在 Microsoft.AspNetCore.Mvc.Controllers.ControllerActivatorProvider.c__DisplayClass4_0.b__0(ControllerContext 控制器上下文)在 Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider.c__DisplayClass5_0.g__CreateController|0(ControllerContext 控制器上下文)在 Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(状态& next, Scope& 范围, Object& 状态, Boolean& isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()

我错过了什么吗?

【问题讨论】:

评论不用于扩展讨论;这个对话是moved to chat。 【参考方案1】:

免责声明:我复制了您的代码,但具有一级继承。

变化

public OpContext(DbContextOptions<DbContext> options) : base(options)     

public OpContext(DbContextOptions<OpContext> options) : base(options)      

为我解决了这个问题。

注意 DbContextOptions 的类型参数。

【讨论】:

很好:) 谢谢edo.n。我会将此标记为答案。

以上是关于Entity Framework DbContext 使用错误的构造函数初始化的主要内容,如果未能解决你的问题,请参考以下文章

Entity Framework Code-First(23):Entity Framework Power Tools

Entity Framework怎么GroupBY多个字段

entity framework 公共类

Entity Framework Fluent API

初步了解Entity Framework

Entity Framework 中的in操作实例