Entity Framework DbContext 是用错误的构造函数初始化的
Entity Framework DbContext is initialized with wrong constructor
在我的 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 Message=No
database provider has been configured for this DbContext. A provider
can be configured by overriding the DbContext.OnConfiguring method or
by using AddDbContext on the application service provider. If
AddDbContext is used, then also ensure that your DbContext type
accepts a DbContextOptions object in its constructor and
passes it to the base constructor for DbContext.
Source=Microsoft.EntityFrameworkCore StackTrace: at
Microsoft.EntityFrameworkCore.Internal.DbContextServices.Initialize(IServiceProvider
scopedProvider, IDbContextOptions contextOptions, DbContext context)
at
Microsoft.EntityFrameworkCore.DbContext.get_InternalServiceProvider()
at Microsoft.EntityFrameworkCore.DbContext.get_ChangeTracker() at
Breeze.Persistence.EFCore.EFPersistenceManager`1..ctor(T context)
at Op.Authors.Api.Breeze.OpPersistenceManager..ctor(OpContext
dbContext) in
C:\dev\UPP\Source\Op\Op.Authors.Api\Breeze\OpPersistenceManager.cs:line
8 at Op.Authors.Api.Controllers.RequestController..ctor(OpContext
dbContext) in
C:\dev\UPP\Source\Op\Op.Authors.Api\Controllers\RequestController.cs:line
21 at
Microsoft.AspNetCore.Mvc.Controllers.ControllerActivatorProvider.<>c__DisplayClass4_0.b__0(ControllerContext
controllerContext) at
Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider.<>c__DisplayClass5_0.g__CreateController|0(ControllerContext
controllerContext) at
Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State&
next, Scope& scope, Object& state, Boolean& isCompleted) at
Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
我是不是漏掉了什么?
免责声明:我复制了您的代码,但具有一级继承。
改变
public OpContext(DbContextOptions<DbContext> options) : base(options) { }
至
public OpContext(DbContextOptions<OpContext> options) : base(options) { }
为我解决了这个问题。
注意 DbContextOptions 的类型参数。
在我的 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 Message=No database provider has been configured for this DbContext. A provider can be configured by overriding the DbContext.OnConfiguring method or by using AddDbContext on the application service provider. If AddDbContext is used, then also ensure that your DbContext type accepts a DbContextOptions object in its constructor and passes it to the base constructor for DbContext.
Source=Microsoft.EntityFrameworkCore StackTrace: at Microsoft.EntityFrameworkCore.Internal.DbContextServices.Initialize(IServiceProvider scopedProvider, IDbContextOptions contextOptions, DbContext context)
at Microsoft.EntityFrameworkCore.DbContext.get_InternalServiceProvider() at Microsoft.EntityFrameworkCore.DbContext.get_ChangeTracker() at Breeze.Persistence.EFCore.EFPersistenceManager`1..ctor(T context)
at Op.Authors.Api.Breeze.OpPersistenceManager..ctor(OpContext dbContext) in C:\dev\UPP\Source\Op\Op.Authors.Api\Breeze\OpPersistenceManager.cs:line 8 at Op.Authors.Api.Controllers.RequestController..ctor(OpContext dbContext) in C:\dev\UPP\Source\Op\Op.Authors.Api\Controllers\RequestController.cs:line 21 at Microsoft.AspNetCore.Mvc.Controllers.ControllerActivatorProvider.<>c__DisplayClass4_0.b__0(ControllerContext controllerContext) at Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider.<>c__DisplayClass5_0.g__CreateController|0(ControllerContext controllerContext) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
我是不是漏掉了什么?
免责声明:我复制了您的代码,但具有一级继承。
改变
public OpContext(DbContextOptions<DbContext> options) : base(options) { }
至
public OpContext(DbContextOptions<OpContext> options) : base(options) { }
为我解决了这个问题。
注意 DbContextOptions 的类型参数。