2017-08-16 26 views
1

在EFCore 2.0中添加新功能,DbContext池。 我知道如何在單一的環境中使用它, 然而,有時需要在項目多背景下,如何使用多個DBContextPool?

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

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

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(); 
    } 
} 

當我使用任何情況下,拋出異常。

System.ArgumentException:類型中的表達 'Microsoft.EntityFrameworkCore.DbContextOptions`1 [MultiContext.Contexts.BContext]' 不能被用於類型的構造符參數「Microsoft.EntityFrameworkCore.DbContextOptions`1 [MultiContext.Contexts。 AContext]' 參數名稱:參數[0] at System.Dynamic.Utils.ExpressionUtils.ValidateOneArgument(MethodBase方法,ExpressionType nodeKind,表達式參數,ParameterInfo pi,String methodParamName,String argumentParamName,Int32索引) at System.Dynamic。 Utils.ExpressionUtils.ValidateArgumentTypes(MethodBase方法,ExpressionType nodeKind,ReadOnlyCollection`1 &參數,String methodParamName) 在System.Linq.Expressions.Expression.New(ConstructorInfo構造函數,Expression []參數) 在Microsoft.EntityFrameworkCore.Internal.DbContextPool`上System.Linq.Expressions.Expression.New(ConstructorInfo構造函數,IEnumerable`1參數) .CreateActivator(DbContextOptions選項) at Microsoft.EntityFrameworkCore.Internal.DbContextPool`1..ctor(DbContextOptions選項) ---從以前位置拋出異常的堆棧跟蹤結束--- 位於System.Runtime.ExceptionServices。 ExceptionDispatchInfo.Throw() at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite,ServiceProvider provider) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.Vis itCallSite(IServiceCallSite調用點,TArgument參數) 在Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(ScopedCallSite scopedCallSite,的ServiceProvider提供商) 在Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitSingleton(SingletonCallSite singletonCallSite,的ServiceProvider提供商) 在Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(IServiceCallSite callSite,TArgument argument) at Microsoft.Extensions.DependencyInjection.ServiceProvider。 <> c__DisplayClass22_0.b__0(的ServiceProvider提供商) 在Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(類型的serviceType) 在Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetService [T](的IServiceProvider提供商) 在Microsoft.Extensions.DependencyInjection。 EntityFrameworkServiceCollectionExtensions。 <> c__2`1.b__2_1(的IServiceProvider P) 在Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitFactory(FactoryCallSite factoryCallSite,的ServiceProvider提供商) 在Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(IServiceCallSite調用點, TArgument參數) 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。 <在Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(類型的serviceType) > c__DisplayClass22_0.b__0(的ServiceProvider提供商) 在Microsoft.Extensions.Internal.ActivatorUtilities.GetService(的IServiceProvider屬,類型類型,類型requiredBy,布爾isDefaultParameterRequired) 在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) 在Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(狀態下&,範圍&範圍,對象&狀態,布爾& isCompleted) 在Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker .d__14.MoveNext() ---從之前的位置拋出異常的堆棧跟蹤結束---在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()上的 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification()上的 任務) at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.d__22.MoveNext() ---堆棧tra結束ce從以前的位置拋出異常--- 在Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() Microsoft.AspNetCore.Mvc.Internal內部資源上下文 .ResourceInvoker.Next(狀態下&,範圍&範圍,對象&狀態,布爾& isCompleted) 在Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.d__17.MoveNext() ---從先前的位置,其中堆棧跟蹤結束拋出異常--- 在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Tas k任務) at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.d__15.MoveNext() ---從以前位置拋出異常的堆棧跟蹤結束--- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw( ) 在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任務task) 在Microsoft.AspNetCore.Builder.RouterMiddleware.d__4.MoveNext() ---從先前的位置堆棧跟蹤,其中引發異常的結束--- System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.d__7.MoveNe xt()

+0

你需要添加配置依賴注入,我的意思是:DbContextOptions 選項 –

+0

看起來像這種情況並沒有預料到。我猜[這個問題](https://github.com/aspnet/EntityFrameworkCore/issues/9433)是你的嗎? –

回答

2

好的。我發現問題。您需要下載EF核心,然後更改構造函數 DbContextPool < TContext>

public DbContextPool([NotNull] DbContextOptions options) 

,並切換到

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

否則DI將使用最後添加的選項:)

+0

請僅使用答案字段來回答問題。使用評論欄來詢問詳情。 – SurvivalMachine

+0

如果您有興趣,我更改了代碼https://github.com/aspnet/EntityFrameworkCore/pull/9465 –