0

我正在将 ASP.NET MVC3 与实体框架一起使用,并使用带有 DI (Ninject) 的通用存储库模式。

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

异常类型:

系统不支持的异常

异常消息:

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

这是堆栈跟踪:

System.Data.Objects.ELinq.Funcletizer.FuncletizingVisitor.InlineObjectQuery(ObjectQuery inlineQuery, Type expressionType) 在 System.Data.Objects.ELinq.Funcletizer.FuncletizingVisitor.InlineValue(Expression expression, Boolean recompileOnChange) 在 System.Data.Objects.ELinq。 Funcletizer.FuncletizingVisitor.Visit(Expression exp) 在 System.Linq.Expressions.EntityExpressionVisitor.VisitExpressionList(ReadOnlyCollection'1 original) 在 System.Linq.Expressions.EntityExpressionVisitor.VisitMethodCall(MethodCallExpression m) 在 System.Linq.Expressions.EntityExpressionVisitor.Visit( System.Linq.Expressions.EntityExpressionVisitor.VisitLambda(LambdaExpression lambda) 在 System.Linq.Expressions 的 System.Data.Objects.ELinq.Funcletizer.FuncletizingVisitor.Visit(Expression exp) 的表达式 exp)。EntityExpressionVisitor.Visit(Expression exp) 在 System.Data.Objects.ELinq.Funcletizer.FuncletizingVisitor.Visit(Expression exp) 在 System.Linq.Expressions.EntityExpressionVisitor.VisitUnary(UnaryExpression u) 在 System.Linq.Expressions.EntityExpressionVisitor.Visit(表达式 exp) 在 System.Data.Objects.ELinq.Funcletizer.FuncletizingVisitor.Visit(Expression exp) 在 System.Linq.Expressions.EntityExpressionVisitor.VisitExpressionList(ReadOnlyCollection'1 original) 在 System.Linq.Expressions.EntityExpressionVisitor.VisitMethodCall(MethodCallExpression m ) 在 System.Linq.Expressions.EntityExpressionVisitor.Visit(Expression exp) 在 System.Data.Objects.ELinq.Funcletizer.FuncletizingVisitor.Visit(Expression exp) 在 System.Data.Objects.ELinq.Funcletizer.Funcletize(表达式表达式,Func '1& recompileRequired) 在 System.Data.Objects.ELinq.ExpressionConverter..ctor(Funcletizer funcletizer, Expression expression) 在 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()GetExecutionPlan(Nullable'1 forMergeOption) 在 System.Data.Objects.ObjectQuery'1.GetResults(Nullable'1 forMergeOption) 在 System.Data.Objects.ObjectQuery'1.System.Collections.Generic.IEnumerable.GetEnumerator() 在系统。 Data.Entity.Internal.Linq.InternalQuery'1.GetEnumerator()GetExecutionPlan(Nullable'1 forMergeOption) 在 System.Data.Objects.ObjectQuery'1.GetResults(Nullable'1 forMergeOption) 在 System.Data.Objects.ObjectQuery'1.System.Collections.Generic.IEnumerable.GetEnumerator() 在系统。 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()

4

1 回答 1

2

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

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

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

于 2012-05-09T14:32:22.503 回答