6

私のプロジェクト (UI レイヤーは asp.mvc) は、.NET 3.5 を使用して開発されました。.NET 4.0 にアップグレードした後、コンパイルされたクエリで問題が発生しました。

 [ArgumentException: Query was compiled for a different mapping source than the one associated with the specified DataContext.]
   System.Data.Linq.CompiledQuery.ExecuteQuery(DataContext context, Object[] args) +863348
   System.Data.Linq.CompiledQuery.Invoke(TArg0 arg0, TArg1 arg1) +110

クエリを実行するたびに、コンテキストを渡しています

return StaticQueries.getTopFiveOrders(mContext, int howMany);


public static Func<Mycontext, int, IQueryable<Order>> getTopFiveOrders
            = CompiledQuery.Compile
                ((Mycontext mContext, int howMany) =>
                 ( some query).Distinct());

2 番目の要求でエラーが発生します。

4

3 に答える 3

4

これは、コンパイルされたクエリの動作方法が変更されたためです。

これらは、常に同じコンテキストを使用して実行する必要があります。

このMicrosoft接続ページでは、変更が行われた理由を説明しています。

この場合の問題は、CompiledQueryがすべての実行に同じマッピングソースを使用する必要があるという事実によって引き起こされます。問題を再現するために使用しているコード例では、DataContextのさまざまなインスタンスが毎回新しいマッピングソースを使用していますが、クエリはこれを報告できず、黙って失敗します。DataContext.LogプロパティまたはSQLServerProfilerなどの他のログを使用する場合、2番目のUPDATEがサーバーに送信されていないことがわかります。

これは.NETFramework4.0で修正され、「クエリは指定されたDataContextに関連付けられたものとは異なるマッピングソース用にコンパイルされました。」などのメッセージを含む例外が報告され、サイレントに失敗することはありません。ただし、LinqTestDataContextのすべてのインスタンスに同じ静的マッピングソースを使用するため、機能しているコードはこれを行う正しい方法です。

基本的にそれは常に問題でしたが、以前は黙って失敗していました。彼らは.NET4で失敗を明示的にしました。

于 2010-11-22T09:28:31.197 に答える
0

私も同様の問題に直面しました。コンパイルされたクエリから静的を削除しましたが、正常に動作します。パフォーマンスにどの程度の違いがあるかはまだわかりませんが.

于 2011-11-04T10:11:05.383 に答える