【问题标题】:different repositories of different project in same query同一查询中不同项目的不同存储库
【发布时间】:2012-05-17 18:59:42
【问题描述】:

我正在使用带有 DI (Ninject) 的通用存储库模式和实体框架的 ASP.NET MVC3。

我有一个其他站点连接到它的主项目(类库)。主项目有它自己的存储库和自己的上下文(它是自己的 .edmx 文件),它们连接到公共表。每个站点都有自己的存储库,这些存储库连接到它自己的表。我的问题是,当我尝试运行将站点表与主项目表结合起来的复杂 linq 查询时,我得到“同一查询中的不同上下文”异常。拜托,你能告诉我我做错了什么吗?

异常类型:

系统不支持的异常

异常信息:

指定的 LINQ 表达式包含对以下查询的引用 与不同的上下文相关联。

这是堆栈跟踪:

System.Data.Objects.ELinq.Funcletizer.FuncletizingVisitor.InlineObjectQuery(ObjectQuery inlineQuery,类型表达式类型)在 System.Data.Objects.ELinq.Funcletizer.FuncletizingVisitor.InlineValue(表达式 表达式,布尔 recompileOnChange) 在 System.Data.Objects.ELinq.Funcletizer.FuncletizingVisitor.Visit(表达式 exp)在 System.Linq.Expressions.EntityExpressionVisitor.VisitExpressionList(ReadOnlyCollection'1 原始)在 System.Linq.Expressions.EntityExpressionVisitor.VisitMethodCall(MethodCallExpression m) 在 System.Linq.Expressions.EntityExpressionVisitor.Visit(表达式 exp) 在 System.Data.Objects.ELinq.Funcletizer.FuncletizingVisitor.Visit(表达式 exp)在 System.Linq.Expressions.EntityExpressionVisitor.VisitLambda(LambdaExpression λ) 在 System.Linq.Expressions.EntityExpressionVisitor.Visit(表达式 exp) 在 System.Data.Objects.ELinq.Funcletizer.FuncletizingVisitor.Visit(表达式 exp)在 System.Linq.Expressions.EntityExpressionVisitor.VisitUnary(UnaryExpression u) 在 System.Linq.Expressions.EntityExpressionVisitor.Visit(表达式 exp) 在 System.Data.Objects.ELinq.Funcletizer.FuncletizingVisitor.Visit(表达式 exp)在 System.Linq.Expressions.EntityExpressionVisitor.VisitExpressionList(ReadOnlyCollection'1 原始)在 System.Linq.Expressions.EntityExpressionVisitor.VisitMethodCall(MethodCallExpression m) 在 System.Linq.Expressions.EntityExpressionVisitor.Visit(表达式 exp) 在 System.Data.Objects.ELinq.Funcletizer.FuncletizingVisitor.Visit(表达式 exp) 在 System.Data.Objects.ELinq.Funcletizer.Funcletize(表达式 表达式,Func'1& recompileRequired) 在 System.Data.Objects.ELinq.ExpressionConverter..ctor(Funcletizer funcletizer,表达式表达式)在 System.Data.Objects.ELinq.ELinqQueryState.CreateExpressionConverter() 在 System.Data.Objects.ELinq.ELinqQueryState.GetExecutionPlan(Nullable'1 forMergeOption) 在 System.Data.Objects.ObjectQuery'1.GetResults(Nullable'1 forMergeOption) 在 System.Data.Objects.ObjectQuery'1.System.Collections.Generic.IEnumerable.GetEnumerator() 在 System.Data.Entity.Internal.Linq.InternalQuery'1.GetEnumerator()
在 System.Data.Entity.Infrastructure.DbQuery'1.System.Collections.Generic.IEnumerable.GetEnumerator() 在 System.Linq.SystemCore_EnumerableDebugView'1.get_Items()

【问题讨论】:

  • 请解释一下“一个其他站点连接到它的主项目”和“代码喊他不能使用两个不同的dbcontext”是什么意思。是否抛出异常?如果是这样,请发布消息、异常类型和堆栈跟踪。
  • @Steven:谢谢我编辑了我的问题。
  • 只有先将不同上下文的数据转换为 IEnumerable,才能合并它们。

标签: .net asp.net-mvc-3 entity-framework dependency-injection ninject


【解决方案1】:

想一想:您有两个不同的上下文,它们在概念上代表两个不同的数据库连接,因此假设 EF 可能甚至是两个不同服务器上的两个不同数据库。您根本无法对包含在两个单独服务器中的数据进行联接在数据库上下文中 - 这就是为什么 EF 强制您使用相同的上下文以便其抽象仍然有效。

正如@GertArnold 在 cmets 中建议的那样,唯一可行的方法是从数据源 A 中获取相关数据,从数据源 B 中获取相关数据并在内存中进行连接(这就是 .AsEnumerable() 本质上会做的事情)。现在,在大多数情况下,您不想这样做,因为您将在内存中实现比必要更多的数据。

因此,请认真考虑重构代码以使用工作单元模式,以便存储库可以使用相同的上下文来避免此问题。这就像使用构造函数注入将上下文传递给您的类库类一样简单。

【讨论】:

  • asEnumerable() 对我的记忆力来说太重了,而 ToList() 会导致性能问题。 “工作单元”听起来很有趣。你能示范一下吗?如何使我的两个存储库都具有不同的 .edmx 文件(使用数据库优先方法的不同项目)使用相同的上下文?
  • 如果您能详细说明一下,我非常感谢。
猜你喜欢
  • 1970-01-01
  • 2018-06-17
  • 1970-01-01
  • 2022-08-03
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多