0

DI(Ninject)で汎用リポジトリパターンを使用するEntityFrameworkでASP.NETMVC3を使用しています。

他のサイトが接続するメインプロジェクト(クラスライブラリ)があります。メインプロジェクトには、共通のテーブルに接続する独自のリポジトリと独自のコンテキスト(独自の.edmxファイル)があります。各サイトには、独自のテーブルに接続する独自のリポジトリがあります。私の問題は、両方のサイトテーブルとメインプロジェクトテーブルを組み合わせた複雑なlinqクエリを実行しようとすると、「同じクエリ内の異なるコンテキスト」例外が発生することです。教えてください、私は何が間違っているのですか?

例外タイプ:

システムnotSupported例外

例外メッセージ:

指定されたLINQ式には、さまざまなコンテキストに関連付けられているクエリへの参照が含まれています。

これはstackTraceです:

System.Data.Objects.ELinq.Funcletizer.FuncletizingVisitor.InlineValue(Expression expression、Boolean recompileOnChange)at System.Data.Objects.ELinq。のSystem.Data.Objects.ELinq.Funcletizer.FuncletizingVisitor.InlineObjectQuery(ObjectQuery inlineQuery、Type expressionType) Funcletizer.FuncletizingVisitor.Visit(Expression exp)at System.Linq.Expressions.EntityExpressionVisitor.VisitExpressionList(ReadOnlyCollection'1 original)at System.Linq.Expressions.EntityExpressionVisitor.VisitMethodCall(MethodCallExpression m)at System.Linq.Expressions.EntityExpressionVisitor System.Linq.ExpressionsのSystem.Linq.Expressions.EntityExpressionVisitor.VisitLambda(LambdaExpression lambda)のSystem.Data.Objects.ELinq.Funcletizer.FuncletizingVisitor.Visit(Expression exp)の式exp)。System.Linq.Expressions.EntityExpressionVisitor.VisitUnary(UnaryExpression u)at System.Linq.Expressions.EntityExpressionVisitor.Visitor.Visit(Expression exp)at System.Linq.Expressions.EntityExpressionVisit(Expression exp)at System.Linq. System.Linq.Expressions.EntityExpressionVisitor.VisitMethodCall(MethodCallExpression m )at System.Linq.Expressions.EntityExpressionVisitor.Visit(Expression exp)at System.Data.Objects.ELinq.Funcletizer.FuncletizingVisitor.Visit(Expression exp)at System.Data.Objects.ELinq.Funcletizer.Funcletize(Expression expression、Func '1&recompileRequired)at System.Data.Objects.ELinq.ExpressionConverter..ctor(Funcletizer funcletizer、Expression expression)at System.Data.Objects.ELinq.ELinqQueryState.CreateExpressionConverter()at System.Data.Objects.ELinq.ELinqQueryState.GetExecutionPlan( System.Data.Objects.ObjectQuery'1.GetResults(Nullable'1 forMergeOption)at System.Data.Objects.ObjectQuery'1.System.Collections.Generic.IEnumerable.GetEnumerator()atSystem.DataのNullable'1forMergeOption)。 Entity.Internal.Linq.InternalQuery'1.GetEnumerator()システムのSystem.Data.Objects.ObjectQuery'1.System.Collections.Generic.IEnumerable.GetEnumerator()のSystem.Data.Objects.ObjectQuery'1.GetResults(Nullable'1 forMergeOption)のGetExecutionPlan(Nullable'1 forMergeOption) Data.Entity.Internal.Linq.InternalQuery'1.GetEnumerator()システムのSystem.Data.Objects.ObjectQuery'1.System.Collections.Generic.IEnumerable.GetEnumerator()のSystem.Data.Objects.ObjectQuery'1.GetResults(Nullable'1 forMergeOption)のGetExecutionPlan(Nullable'1 forMergeOption) 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

考えてみてください: 2 つの異なるデータベース接続を概念的に表す 2 つの異なるコンテキストがあるため、EF に関する限り、2 つの異なるサーバー上の 2 つの異なるデータベースでさえある可能性があります。データベース コンテキスト内の2 つの別個のサーバーに含まれるデータを結合することはできません。そのため、EF は同じコンテキストを使用することを強制して、その抽象化が引き続き機能するようにしています。

@GertArnold がコメントで示唆したように、実行可能な唯一の方法は、データ ソース A から関連データを取得し、データ ソース B から関連データを取得して、メモリ内で結合を行うことです (これが.AsEnumerable()本質的に実行されることです)。必要以上に多くのデータをメモリに実体化するため、ほとんどの場合、これを行う必要はありません。

そのため、リポジトリが同じコンテキストを使用してこの問題を回避できるように、作業単位パターンを使用するようにコードをリファクタリングすることを強く検討してください。これは、コンストラクター インジェクションを使用してクラス ライブラリ クラスにコンテキストを渡すのと同じくらい簡単です。

于 2012-05-09T14:32:22.503 に答える