2017-08-16 2 views
1

In EFCore 2.0 Fügen Sie neues Feature, DbContext-Pooling. ich weiß, wie es in einzelnen Kontext zu verwenden, müssen jedoch manchmal mehr Kontext in Projekt,Wie benutze ich multi 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"); 
}); 

-Controller

public class HomeController : Controller 
{ 
    private readonly AContext aContext; 

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

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

Wenn ich jeden Kontext zu verwenden, Ausnahmewurf.

System.ArgumentException: Expression des Typs 'Microsoft.EntityFrameworkCore.DbContextOptions`1 [MultiContext.Contexts.BContext]' kann nicht für Konstruktor Parameter des Typs verwendet werden ‚Microsoft.EntityFrameworkCore.DbContextOptions`1 [MultiContext.Contexts. AContext] ' Parametername: Argumente [0] bei System.Dynamic.Utils.ExpressionUtils.ValidateOneArgument (MethodBase-Methode, ExpressionType nodeKind, Expression-Argumente, ParameterInfo pi, String methodParamName, String argumentParamName, Int32-Index) bei System.Dynamic. Utils.ExpressionUtils.ValidateArgumentTypes (MethodBase-Methode, ExpressionType nodeKind, ReadOnlyCollection`1 & Argumente, String methodParamName) Bei System.Linq.Expressions.Expression.New (KonstruktorInfo-Konstruktor, IEnumerable`1 Argumente) bei System.Linq.Expressions.Expression.New (KonstruktorInfo-Konstruktor, Expression [] Argumente) bei Microsoft.EntityFrameworkCore.Internal.DbContextPool`1 .CreateActivator (DbContextOptions-Optionen) bei Microsoft.EntityFrameworkCore.Internal.DbContextPool`1..ctor (DbContextOptions-Optionen) --- Ende des Stack-Trace vom vorherigen Speicherort, an dem die Ausnahme ausgelöst wurde --- bei System.Runtime.ExceptionServices. ExceptionDispatchInfo.Throw() bei Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor (ConstructorCallSite-KonstruktorCallSite, ServiceProvider-Provider) bei Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.Vis itCallSite (IServiceCallSite callSite, TArgument Argument) bei Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped (ScopedCallSite scopedCallSite, Serviceprovider-Provider) an Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitSingleton (SingletonCallSite singletonCallSite, Serviceprovider-Provider) an Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite (IServiceCallSite callSite, Argument TArgument) bei Microsoft.Extensions.DependencyInjection.ServiceProvider. <> c__DisplayClass22_0.b__0 (Serviceprovider-Provider) bei Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService (Typ Servicetype) bei Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetService [T] (IServiceProvider Provider) bei Microsoft.Extensions.DependencyInjection. EntityFrameworkServiceCollectionExtensions. <> c__2`1.b__2_1 (IServiceProvider p) bei Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitFactory (FactoryCallSite factoryCallSite, Serviceprovider-Provider) an Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite (IServiceCallSite callSite, TArgument-Argument) bei Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped (ScopedCallSite scopedCallSite, Dienstanbieter Provider) bei Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite (IServiceCallSite callSite, Argument TArgument) bei Microsoft.Extensions.DependencyInjection.ServiceProvider. <> c__DisplayClass22_0.b__0 (Serviceprovider-Provider) bei Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService (Typ Servicetype) bei Microsoft.Extensions.Internal.ActivatorUtilities.GetService (IServiceProvider sp, Typ Typ, Typ requiredBy, Boolean isDefaultParameterRequired) bei lambda_method (Closure, IServiceProvider, Object []) bei Microsoft.AspNetCore.Mvc.Controllers.ControllerActivatorProvider. <> c__DisplayClass4_0.b__0 (ControllerContext controllerContext) bei Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider. <> c__DisplayClass5_0.g__CreateController0 (Controllercontroller) bei Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next (State & nächsten, Scope & Umfang, Object & Zustand, Boolean & IsCompleted) bei Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker .d__14.MoveNext() --- Ende der Stapelüberwachung von der vorherigen Position, an der die Ausnahme ausgelöst wurde --- bei System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Task Aufgabe) bei Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.d__22.MoveNext() --- Ende des Stapels tra ce von der vorherigen Position, an der die Ausnahme ausgelöst wurde --- bei System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() bei Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow (ResourceExecutedContext-Kontext) bei Microsoft.AspNetCore.Mvc.Internal .ResourceInvoker.Next (State & nächstes Scope & Umfang, Object & Zustand, Boolean & IsCompleted) bei Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.d__17.MoveNext() --- Ende der Stapelüberwachung von früheren Stelle, wo Ausnahme wurde ausgelöst --- bei System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Tas k Aufgabe) at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.d__15.MoveNext() --- Ende des Stack-Trace von früheren Speicherort, wo Ausnahme ausgelöst wurde --- bei System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Task-Task) bei Microsoft.AspNetCore.Builder.RouterMiddleware.d__4.MoveNext() --- Ende des Stack-Trace aus früheren Stelle, wo Ausnahme ausgelöst wurde --- bei System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Task-Task) bei Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.d__7.MoveNe xt()

+0

Sie müssen eine Konfiguration für die Abhängigkeitsinjektion hinzufügen, ich meine dafür: DbContextOptions Optionen –

+0

Dieses Szenario wurde nicht erwartet. Ich nehme an, [diese Ausgabe] (https://github.com/aspnet/EntityFrameworkCore/issues/9433) gehört Ihnen? –

Antwort

2

Ok. Ich habe ein Problem gefunden.Sie benötigen EF-Core zum Download, dann Konstruktor für DbContextPool < TContext>

Original

public DbContextPool([NotNull] DbContextOptions options) 

und ändern

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

ändern sonst DI zuletzt hinzugefügten Optionen verwenden :)

+0

Bitte benutzen Sie das Antwortfeld nur zur Beantwortung der Frage. Verwenden Sie das Kommentarfeld, um nach Details zu fragen. – SurvivalMachine

+0

Wenn Sie interessiert sind, habe ich den Code https://github.com/aspnet/EntityFrameworkCore/pull/9465 geändert –