同一查询中不同项目的不同存储库

时间:2012-05-09 09:14:42

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

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

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

例外类型:

  

system notSupported exception

异常消息:

  

指定的LINQ表达式包含对查询的引用   与不同的背景相关联。

这是stackTrace:

  

System.Data.Objects.ELinq.Funcletizer.FuncletizingVisitor.InlineObjectQuery(的ObjectQuery   inlineQuery,Type expressionType)at   System.Data.Objects.ELinq.Funcletizer.FuncletizingVisitor.InlineValue(表达式   表达式,Boolean recompileOnChange)at   System.Data.Objects.ELinq.Funcletizer.FuncletizingVisitor.Visit(表达式   exp)at   System.Linq.Expressions.EntityExpressionVisitor.VisitExpressionList(ReadOnlyCollection'1   原来)   System.Linq.Expressions.EntityExpressionVisitor.VisitMethodCall(MethodCallExpression   m)at   System.Linq.Expressions.EntityExpressionVisitor.Visit(Expression exp)   在   System.Data.Objects.ELinq.Funcletizer.FuncletizingVisitor.Visit(表达式   exp)at   System.Linq.Expressions.EntityExpressionVisitor.VisitLambda(LambdaExpression   lambda)   System.Linq.Expressions.EntityExpressionVisitor.Visit(Expression exp)   在   System.Data.Objects.ELinq.Funcletizer.FuncletizingVisitor.Visit(表达式   exp)at   System.Linq.Expressions.EntityExpressionVisitor.VisitUnary(UnaryExpression   你在   System.Linq.Expressions.EntityExpressionVisitor.Visit(Expression exp)   在   System.Data.Objects.ELinq.Funcletizer.FuncletizingVisitor.Visit(表达式   exp)at   System.Linq.Expressions.EntityExpressionVisitor.VisitExpressionList(ReadOnlyCollection'1   原来)   System.Linq.Expressions.EntityExpressionVisitor.VisitMethodCall(MethodCallExpression   m)at   System.Linq.Expressions.EntityExpressionVisitor.Visit(Expression exp)   在   System.Data.Objects.ELinq.Funcletizer.FuncletizingVisitor.Visit(表达式   exp)at System.Data.Objects.ELinq.Funcletizer.Funcletize(Expression   表达,Func'1& recompileRequired)at   System.Data.Objects.ELinq.ExpressionConverter..ctor(Funcletizer   funcletizer,表达表达式)at   System.Data.Objects.ELinq.ELinqQueryState.CreateExpressionConverter()   在   System.Data.Objects.ELinq.ELinqQueryState.GetExecutionPlan(Nullable'1   forMergeOption)at   System.Data.Objects.ObjectQuery'1.GetResults(Nullable'1   forMergeOption)at   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()

1 个答案:

答案 0 :(得分:2)

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

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

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