如何使用多个DBContextPool? [英] how to use multi DBContextPool?

查看:155
本文介绍了如何使用多个DBContextPool?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在EFCore 2.0中添加新功能DbContext池。
i知道如何在单个上下文中使用它,但是
有时在项目中需要多上下文,

In EFCore 2.0 Add new feature, DbContext pooling. i know how to use it in single context, however, sometimes need multi context in project,

public class BContext : DbContext
{
    public BContext(DbContextOptions<BContext> options) : base(options) { }
}

public class AContext : DbContext
{
    public AContext(DbContextOptions<AContext> options) : base(options) { }
}

ConfigureServices

ConfigureServices

services.AddDbContextPool<AContext>(options =>
{
    options.UseInMemoryDatabase("AContext.InMemory");
});
services.AddDbContextPool<BContext>(options =>
{
    options.UseInMemoryDatabase("BContext.InMemory");
});

控制器

public class HomeController : Controller
{
    private readonly AContext aContext;

    public HomeController(AContext aContext)
    {
        this.aContext = aContext;
    }

    public IActionResult Index()
    {
        return View();
    }
}

当我使用任何上下文时,都会引发异常。

When i use any context, exception throw.


System.ArgumentException:类型'Microsoft.EntityFrameworkCore.DbContextOptions`1 [MultiContext.Contexts.BContext]'的表达式不能用于构造函数的参数类型'Microsoft.EntityFrameworkCore.DbContextOptions`1 [MultiContext.Contexts.AContext]'
参数名称:System.Dynamic.Utils.ExpressionUtils.ValidateOneArgument(MethodBase方法,ExpressionType nodeKind,表达式的arguments [0]
参数,ParameterInfo pi,字符串methodParamName,字符串argumentsParamName,Int32索引)System.Dynamic.Utils.ExpressionUtils.ValidateArgumentTypes(MethodBase方法,ExpressionType nodeKind,ReadOnlyCollection`1&参数,字符串methodParamName)
.Linq.Expressions.Expression.New(ConstructorInfo构造函数,IEnumerable`1个参数)
在System.Linq.Expressions.Expression.New(ConstructorInfo const ructor,Expression []参数)Microsoft.EntityFrameworkCore.Internal.DbContextPool`1.CreateActivator(DbContextOptions选项)
Microsoft.EntityFrameworkCore.Internal.DbContextPool`1..ctor(DbContextOptions选项)
-从先前抛出异常的位置开始的堆栈结束跟踪--- System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()中的
在Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver中为
。 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(IServiceCallSite callSite,TArgument参数)上的VisitConstructor(ConstructorCallSite构造函数CallSite,ServiceProvider提供者)
Microsoft.Extensions.DependencyInjectr。 ScopedCallSite scopedCallSite,ServiceProvider提供者)Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitSingleton(Singlet)中的
onCallSite singletonCallSite,ServiceProvider提供者)Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(IServiceCallSite callSite,TArgument参数)中的
Microsoft.Extensions.DependencyInjection.ServiceProvider中的
。<> c__DisplayClass22_0 (服务提供者)在Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(类型serviceType)
在Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetService [T](IServiceProvider提供者)在Microsoft。 Extensions.DependencyInjection.EntityFrameworkWorkCollectionExtensions。<> c__2`1.b__2_1(IServiceProvider p)
在Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitFactory(FactoryCallSite factoryCallSite,ServiceProvider provider)在Microsoft.Extensions是
。 DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(IServiceCallSite callSite,TArgument参数t)Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteSite(IServiceCallSment(IServiceCallSment))上的
,位于Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(ScopedCallSite scopedCallSite,ServiceProvider提供者) Microsoft.Extensions.DependencyInjection.ServiceProvider的
。<> c__DisplayClass22_0.b__0(服务提供商的提供者)Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(类型serviceType)的
在Microsoft.Extensions。 Internal.ActivatorUtilities.GetService(IServiceProvider sp,类型类型,requiredBy,布尔值isDefaultParameterRequired)位于lambda_method处的
(位于Microsoft.AspNetCore.Mvc.Controllers.ControllerActivatorProvider处的Closure,IServiceProvider,Object [])
。 > c__DisplayClass4_0.b__0(ControllerContext controllerContext)
在Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider。<> c__DisplayClas s5_0.g__CreateController0(ControllerContext controllerContext)
at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State&接下来,Scope&范围,对象与对象状态,布尔值和isCompleted)
在Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__14.MoveNext()
---从上一个引发异常的位置开始的堆栈跟踪---
在System。 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)的Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
(Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.d__22.MoveNext()的
b-从先前抛出异常的位置开始的堆栈结束跟踪--System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()中的
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow中的
(ResourceExecutedContext上下文)Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(State& Next,Scope&范围,Object&状态,Boolean& isCompleted)中的
Microsoft.AspNetCore.Mvc.Internal。 ResourceInvoker.d__17.MoveNext()
-上一个位置的堆栈结束跟踪引发了异常--- System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)在Microsoft.AspNetCore.Mvc中为
.Internal.ResourceInvoker.d__15.MoveNext()
---从上一个引发异常的位置开始的堆栈跟踪--- System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
b在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)在Microsoft.AspNetCore.Builder.RouterMiddleware.d__4.MoveNext()中的
-从上次发生异常的位置开始的堆栈跟踪---
在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)
在Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware .d__7.MoveNext()

System.ArgumentException: Expression of type 'Microsoft.EntityFrameworkCore.DbContextOptions`1[MultiContext.Contexts.BContext]' cannot be used for constructor parameter of type 'Microsoft.EntityFrameworkCore.DbContextOptions`1[MultiContext.Contexts.AContext]' Parameter name: arguments[0] at System.Dynamic.Utils.ExpressionUtils.ValidateOneArgument(MethodBase method, ExpressionType nodeKind, Expression arguments, ParameterInfo pi, String methodParamName, String argumentParamName, Int32 index) at System.Dynamic.Utils.ExpressionUtils.ValidateArgumentTypes(MethodBase method, ExpressionType nodeKind, ReadOnlyCollection`1& arguments, String methodParamName) at System.Linq.Expressions.Expression.New(ConstructorInfo constructor, IEnumerable`1 arguments) at System.Linq.Expressions.Expression.New(ConstructorInfo constructor, Expression[] arguments) at Microsoft.EntityFrameworkCore.Internal.DbContextPool`1.CreateActivator(DbContextOptions options) at Microsoft.EntityFrameworkCore.Internal.DbContextPool`1..ctor(DbContextOptions options) --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, ServiceProvider provider) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(IServiceCallSite callSite, TArgument argument) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(ScopedCallSite scopedCallSite, ServiceProvider provider) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitSingleton(SingletonCallSite singletonCallSite, ServiceProvider provider) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(IServiceCallSite callSite, TArgument argument) at Microsoft.Extensions.DependencyInjection.ServiceProvider.<>c__DisplayClass22_0.b__0(ServiceProvider provider) at Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(Type serviceType) at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetService[T](IServiceProvider provider) at Microsoft.Extensions.DependencyInjection.EntityFrameworkServiceCollectionExtensions.<>c__2`1.b__2_1(IServiceProvider p) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitFactory(FactoryCallSite factoryCallSite, ServiceProvider provider) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(IServiceCallSite callSite, TArgument argument) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(ScopedCallSite scopedCallSite, ServiceProvider provider) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(IServiceCallSite callSite, TArgument argument) at Microsoft.Extensions.DependencyInjection.ServiceProvider.<>c__DisplayClass22_0.b__0(ServiceProvider provider) at Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(Type serviceType) at Microsoft.Extensions.Internal.ActivatorUtilities.GetService(IServiceProvider sp, Type type, Type requiredBy, Boolean isDefaultParameterRequired) at lambda_method(Closure , IServiceProvider , Object[] ) at Microsoft.AspNetCore.Mvc.Controllers.ControllerActivatorProvider.<>c__DisplayClass4_0.b__0(ControllerContext controllerContext) at Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider.<>c__DisplayClass5_0.g__CreateController0(ControllerContext controllerContext) at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__14.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.d__22.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext context) at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.d__17.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.d__15.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.AspNetCore.Builder.RouterMiddleware.d__4.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.d__7.MoveNext()


推荐答案

好。我发现了问题。您需要下载EF Core,然后更改
DbContextPool<的构造函数。 TContext>

Ok. i've found problem. You need to download EF Core, then change constructor for DbContextPool< TContext>

原始

public DbContextPool([NotNull] DbContextOptions options)

并更改为

public DbContextPool([NotNull] DbContextOptions<TContext> options)

否则DI将使用最后添加的选项:)

otherwise DI will use last added options :)

这篇关于如何使用多个DBContextPool?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆