一个实体类型多个数据库上下文?

时间:2017-08-07 20:21:08

标签: c# entity-framework dbcontext

上下文继承

// MobileContext has VisitPlan, Customer, etc. that all the following contexts need.
public MobileContext : DbContext { } 
public AuthenticationEntities : MobileContext { }
public OrderEntities : MobileContext { }
public ThriftEntities : MobileContext { }

上下文是代码优先的,我不使用它们来创建数据库。

描述

我创建了一个UserPermissionService的实例,其中包含VisitPlanUserBranch等的存储库。所有存储库都位于AuthenticationEntities Customer的所有存储库中VisitPlanMobileContext AuthenticationEntites的一部分,UserBranch和所有其他背景都是继承的。

问题

当我尝试执行加入VisitPlanDbContext的查询时,它告诉我我无法在两个上下文之间进行查询,但是如果我查看存储库的AuthenticationEntities处的调试器它们都是// // USER-BRANCHES: Check the user branches table for permissions. // var branches = Branches .GetAll() .Where(x => x.AzureUser.Username == username && x.StartDate <= effective && x.EndDate >= effective); // // USER-ROUTES: Check the user routes table for permissions. // var routes = Routes .GetAll() .Where(x => x.AzureUser.Username == username && x.StartDate <= effective && x.EndDate >= effective); // // USER-DRIVERS: Check the user driver number table for permissions. // var drivers = DriverNumbers .GetAll() .Where(x => x.AzureUser.Username == username && x.StartDate <= effective && x.EndDate >= effective); // // VISIT PLANS: Retrieve a list of visit plans currently active. // var vpQuery = VisitPlans .GetAll() .Where( x => x.FromDate <= effective && x.ToDate >= effective && ( branches.Any(b => b.Branch == x.Branch) || routes.Any(r => r.Route == x.Route) || drivers.Any(d => d.DriverNumber == x.DriverNumber) ) ); // // QUERY: Retrieve all the customers which have effective stop plans and are included in one of the above queries. // var customerQuery = vpQuery .Join( inner: Customers.GetAll(), outerKeySelector: x => x.SAPCustomerID, innerKeySelector: x => x.SAPCustomerID, resultSelector: (vp, c) => c ); 类型。

有没有办法实现这个目标?

查询

VisitPlans

其中:

  • Repository<VisitPlan>的类型为AuthenticationEntitiesDbContextCustomers
  • Repository<Customer>的类型为AuthenticationEntitiesDbContextBranches
  • Repository<UserBranch>的类型为AuthenticationEntitiesDbContextRoutes
  • Repository<UserRoute>的类型为AuthenticationEntitiesDbContextDriverNumbers
  • Repository<UserDriverNumber>的类型为AuthenticationEntitiesDbContextggplot(cars, aes(x = speed, y = dist)) + geom_point() + coord_cartesian(xlim = c(min(.$speed), max(.$speed) + 10))

1 个答案:

答案 0 :(得分:1)

它们属于同一类型并不重要。您必须使用DbContext的单个实例。在使用实体框架时,必须在该单个上下文实例上完成单个查询(在这种情况下为Join)。

理想情况下,您应该只使用一个负责对数据库进行所有查询的DbContext实例。如果您使用多个数据库,那么您有多个实例(对于单个请求)的唯一原因就是。

但是,我们假设你需要有多个上下文对象。您需要做的是查询每个上下文并将结果拉入内存。这可以通过在每个查询结束时调用.ToList()来完成。

一旦数据是内存,您就可以将它们连接在一起。这是一个例子:

var vpQuery = authContext.VisitPlan.Where(x => x == something).ToList();
var ubQuery = permissionContext.UserBranch.Where(u => u == somethingElse).ToList();
var joined = vpQuery.Join(vpQuery, vp => vp.UserKey, ub => ub.UserKey, (vp, ub) => new { Property1 = ub.Something, Property2 = vp.SomethingElse);

但是,根据您发布的内容,您绝对不需要多个上下文实例。很可能您的存储库代码(可能是不必要的)是持有或创建与其他存储库的上下文对象不同的上下文。如果你想使用延迟加载并实际生成&amp ;,它们应该共享一个上下文实例。仅在需要时执行查询。