0

ユーザーが ASP Web フォームを使用してページを送信すると、多くのストアド プロシージャが実行されるシステムで、非常に複雑な問題が発生します。関連するテーブルから特定のアイテムを更新または削除しますが、これはすべてストアド プロシージャで発生するため、linq to sql はこのロジックを認識しないため、キャッシュは削除されたアイテムと共にそこに残ります。

私が見ている問題は、更新されている複合キーベースのテーブルにあるため、ストアドプロシージャを介してすべてのコンテンツが削除され、アイテムが再作成され、新しい値で挿入されますが、エンティティが次のように見えると仮定すると:

public class SomeCompositeEntity
{
    public long UserId {get;set;}
    public smallint ActionTypeId {get;set;}
    public int ActionValue {get;set;}
}

したがって、この場合、それらのうち 10 個があり、3 個を更新した場合、それらはすべてこのストアド プロシージャを介して削除され、その後再作成されます。そのうち 7 個は既存のものと同一であり、3 個は同じ ID ですが異なる値です。

問題は、削除は DB スペースでのみ発生するため、linq はこれを認識しないため、これらのエンティティを linq から sql に保存しようとすると、DuplicateKeyException で爆発しますが、これは正しいことです。

したがって、DuplicateKeyException をキャッチし、エンティティを取得して linq に sql に通知し、DB からの変更を上書きしてリフレッシュするように指示した場合、オブジェクトが削除されている場合、キャッシュからオブジェクトが削除されますか? ドキュメントはそれについて明確ではないので?

私はストアドプロシージャと他の多くの複雑なプロセスを削除したいと思っていますが、クライアントは、それが何らかの形で終わりを引き起こす場合に備えて変更できないと断固として主張しています...このシナリオをどのように処理するかについてのアイデアは素晴らしいでしょう。

4

1 に答える 1

0

現在、私は厄介なことをしなければなりません...そして、各保存の前にLinqのキャッシュを空にします。例外に対応して処理しようとしましたが、変更された状態でオブジェクトを更新できないため、プロアクティブになって例外の発生を停止しようとしましたが、アイテムがキャッシュにあるかどうかを確認する必要がありました。その場合は、それらを削除するか、スワップ/マージしても、エラーが引き続き発生します。

とにかく、ここに私が最終的に使用したコードがありますが、これは恐ろしいですが、仕事をします.

public static void ClearEntityCache(this IDataContext dataContext)
        {
            const BindingFlags flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
            var method = dataContext.GetType().GetMethod("ClearCache", flags);
            method.Invoke(dataContext, null);
        }

上記の IDataContext は、単体テスト用のデータ レイヤーをモックするために作成した単純なラッパー インターフェイスです。

于 2013-06-27T08:12:44.580 に答える