2009-07-31 7 views
6

Linq2Sqlのデータコンテキストでの変更を検証するにはどうすればいいですか? SubmitChanges()を呼び出す前に、の前に誰でも教えてください。私が持っている状況は、コンテキストを作成し、複数の操作を実行し、他の処理タスクと一緒に多くの挿入を追加して、サブミットが失敗した場合にロールバックすることです。SubmitChanges()の前にLinq2Sqlを検証する

私がやりたいことは、特定のタスクが完了した後に何らかの "Validate()"コールを行い、ジョブ全体を送信する前に処理できるようにすることです。あなたは私が持っているもの

ChangeSet changes = dataContext.GetChangeSet(); 

// An IList<Object> 
changes.Deletes; 
changes.Inserts; 
changes.Updates; 

を呼び出すことができ、データのコンテキスト内のすべての変更を取得するには

答えて

6

は、各値のオブジェクトはvalidateメソッドを持っています。私はアトリビュートを使ってさまざまな種類のバリデーションを定義します。私が手動で行う理由は、データベースとコードにint型の数値があるため、年齢を保存すると1002の値が無効になる可能性があるからです。だから私は値の範囲などを与えることができます。 。

各値オブジェクトが基本オブジェクトから継承される場合、その値オブジェクトは繰り返しやすくなります。基本クラスにValidateメソッドがあると仮定します。

私はこれが機能することを指摘しますが、生成されたコードを編集するか、独自の値オブジェクトをロールバックする必要があります。私は通常、自分のロールを使って、どのように検証のために使うのですか?

+0

は前.GetChangeSet()メソッドに気づいたことはありません!ありがとう! +1 – StevenMcD

+0

実際に私が行ったアプローチは、テーブルの名前を持つ部分クラスを作成し、検証したいフィールドのOnFooChanging()に検証コードを実装することでした。それは、SubmitChanges()ではなく値が設定されたときにただちに例外をスローするように機能します。私はChangeSetを使用しませんでしたが、それは正しい方向に私を指し、とにかく知っておくと便利です。 –

+0

@Nick - 私はそれについて読んだブログを覚えていないので、これはあなたには役に立たないと感じていますが、複雑な検証シナリオが可能であるため、 "OnChange"ハンドラとは別に検証を続けるのは良い考えです。あるプロパティの検証は、他のプロパティの値に依存します。 – Mark

5

OnValidate()関数をLINQ-to-SQLエンティティの部分クラスと共に使用することもできます。 OnValidate()は、SubmitChanges()の間にデータがデータベースに送信される前に呼び出されます。 OnValidate()の素晴らしい点の1つは、ChangeAction列挙によってCRUDアクションを区別できるということです。例えば

public partial class YourEntity 
{ 
    partial void OnValidate(System.Data.Linq.ChangeAction action) 
    { 
     if(action == System.Data.Linq.ChangeAction.Insert) 
      // Do insert 
     ... etc. ... 
    } 
} 
関連する問題