1

LINQToSQLは初めてです。特定のエンティティのDataContextクラスの「InsertOnSubmit」または「DeleteOnSubmit」メソッドを上書きする方法はありますか?

たとえば、ユーザーがUIから顧客レコードを削除した場合に当てはまるブールフィールド「IsDeleted」を持つCustomersというデータベーステーブルがあります。_myDataContext.Customers.DeleteOnSubmit(..)を呼び出すと、デフォルトでは、不要なレコードがテーブルから物理的に削除されます。代わりに、「IsDeleted」フィールドをtrueに設定して、論理的に削除したいと思います。

これを行う1つの方法は、オブジェクトを取得し、プロパティ値を設定した後に(Deleteではなく)Updateメソッドを呼び出すことです。これも同様に機能しますが、好奇心から、標準のDataContextメソッド(InsertOnSubmit、DeleteOnSubmitなど)が上書き可能かどうかを知りたいですか?もしそうなら、どのように?

ありがとう

4

3 に答える 3

0

私の知る限り、そうではありません。削除したくない場合は...deleteを呼び出さないでください!ただし、他のいくつかのオプション:

  • データベースにフラグを設定するだけのストアドプロシージャに削除をマップできます。
  • 電話をかける前にSubmitChanges、変更を(経由で)上書きして修正できる場合がありますが、これが良いアイデアかどうかは疑問です。たとえば、アイテムを再挿入する必要がある場合があります。GetChangetSetbase.SubmitChanges

コード:

partial class MyDataContext {
    public override void SubmitChanges(ConflictMode failureMode) {
        var delta = GetChangeSet();
        foreach(var record in delta.Deletes.OfType<Customer>()) {
            Customers.InsertOnSubmit(record);
            record.IsDeleted = true;
        }
        base.SubmitChanges(failureMode);
    }
}

明らかに、より柔軟にする必要がある場合は、(厳密なプロパティGetTable()ではなく)使用することをお勧めします。Customers


コメントの更新。正直なところ、その時点でそれができるとは思いません。「10の場所」について...IMOは、とにかくリポジトリインターフェイスの背後にデータコンテキストを隠す必要があるため、10の場所すべてがCreateUser、データコンテキストと必要なロジックを処理するようなメソッドを呼び出します(おそらく別の一部のルールを処理するビジネスロジッククラス)。さらに、同時実行性の懸念があるため、一意性は通常、データベースレベルで(制約を介して)処理する必要があります。

しかし、それらを保存しようとする前に、あなたが望むことをするために:

partial class MyDataContext {
    public override void SubmitChanges(ConflictMode failureMode) {
        var delta = GetChangeSet();
        foreach(var record in delta.Inserts.OfType<User>()) {
            if(Users.Any(x=>x.Name == record.Name) {...throw an exception...}
        }
        base.SubmitChanges(failureMode);
    }
}
于 2009-06-15T09:48:26.543 に答える
0

私はまだそれをテストしていませんが、私はあなたを助けることができると思います

http://www.devart.com/linqconnect/docs/ExecuteDynamicMethods.html

于 2014-01-06T13:13:06.110 に答える