代码拉取完成,页面将自动刷新
产品库:主库ProductMaster(两个从库ProductSlave1,ProudctSlave2)
/// <summary>
/// 主库上下文,定义了两个从库定位器
/// </summary>
[AppDbContext("MSSQLProductMaster", DbProvider.SqlServer, typeof(ProductSlaveDbContextLocator), typeof(ProductSlave2DbContextLocator))]
public class ProductMasterDbContext : AppDbContext<ProductMasterDbContext, ProductMasterDbContextLocator>
{
public ProductMasterDbContext(DbContextOptions<ProductMasterDbContext> options) : base(options)
{
InsertOrUpdateIgnoreNullValues = true;
}
}
业务层读数据:
仓库声明(指定了主库定位器)
private readonly IMSRepository<ProductMasterDbContextLocator> msRepository;
随机从库Slave<>()(非Slave1或Slave2) 读取数据时报错,提示找不到从库上下文。
var p=await msRepository.Slave<ProductBase>().FindOrDefaultAsync(id);
System.InvalidOperationException: Cannot create a DbSet for 'ProductBase' because this type is not included in the model for the context.
at Microsoft.EntityFrameworkCore.Internal.InternalDbSet`1.get_EntityType()
at Microsoft.EntityFrameworkCore.Internal.InternalDbSet`1.CheckState()
at Microsoft.EntityFrameworkCore.Internal.InternalDbSet`1.get_EntityQueryable()
at Microsoft.EntityFrameworkCore.Internal.InternalDbSet`1.System.Linq.IQueryable.get_Provider()
at Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.AsNoTracking[TEntity](IQueryable`1 source)
at Furion.DatabaseAccessor.PrivateRepository`1..ctor(Type dbContextLocator, IServiceProvider serviceProvider) in D:\660-Self\01-WeiFuWu\01-Furion\framework\Furion\DatabaseAccessor\Repositories\EFCoreRepository.cs:line 229
at Furion.DatabaseAccessor.EFCoreRepository`2..ctor(IServiceProvider serviceProvider) in D:\660-Self\01-WeiFuWu\01-Furion\framework\Furion\DatabaseAccessor\Repositories\EFCoreRepository.cs:line 185
at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor, Boolean wrapExceptions)
at System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, RuntimeResolverContext context)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitCache(ServiceCallSite callSite, RuntimeResolverContext context, ServiceProviderEngineScope serviceProviderEngine, RuntimeResolverLock lockType)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScopeCache(ServiceCallSite singletonCallSite, RuntimeResolverContext context)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.Resolve(ServiceCallSite callSite, ServiceProviderEngineScope scope)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.DynamicServiceProviderEngine.<>c__DisplayClass1_0.<RealizeService>b__0(ServiceProviderEngineScope scope)
at Furion.DatabaseAccessor.MSRepository`1.Slave[TEntity](Func`1 locatorHandle) in D:\660-Self\01-WeiFuWu\01-Furion\framework\Furion\DatabaseAccessor\Repositories\MSRepository.cs:line 127
at Furion.DatabaseAccessor.MSRepository`1.Slave[TEntity]() in D:\660-Self\01-WeiFuWu\01-Furion\framework\Furion\DatabaseAccessor\Repositories\MSRepository.cs:line 105
at Furion.Application.Product.Service.ProductService.GetList() in D:\660-Self\01-WeiFuWu\01-Furion\samples_test\Furion.Application\Product\Service\ProductService.cs:line 89
at lambda_method303(Closure , Object )
at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.AwaitableObjectResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeActionMethodAsync>g__Logged|12_1(ControllerActionInvoker invoker)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeNextActionFilterAsync>g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
--- End of stack trace from previous location ---
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextExceptionFilterAsync>g__Awaited|25_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
SqlServer
对于非默认主库的多个从库,在读取数据时,根据仓库声明时指定的主库(private readonly IMSRepository msRepository;),和主库上下文定义的多个从库( AppDbContext("MSSQLProductMaster", DbProvider.SqlServer, typeof(ProductSlaveDbContextLocator), typeof(ProductSlave2DbContextLocator))] ),
在进行从库读数据时从库随机( msRepository.Slave() )。
原因是 IEntity
只配置了主库定位器,并无配置从库定位器,应该补上几个从库定位器。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
登录 后才可以发表评论