2011年01月25日

LINQ to SQL番外編 - エンティティ クラスの更新時にデータを検証するには

   このエントリーをはてなブックマークに追加 Clip to Evernote
たぶん、この記事に書いてある情報は、日本語初の情報です。
MSDNライブラリの情報も中途半端で正しい内容ではありません。

前回、変更時の値のチェックについて説明しましたが、エンティティクラス全体の更新時に
データを検証することもできます。
この更新時の検証では、業務アプリケーションの要件に応じて複数のカラムの値を見て、
検証することができます。

以下にNorthwindデータベースを例に、その手順を示します。

  1. Visual Studio のソリューションエクスプローラで、プロジェクトに追加されているNorthwind.dbml
    ファイル(LINQ to SQL クラスファイル)を右クリックします。

  2. コンテキストメニューから「[コードの表示] をクリックします。コード エディターが開き、
    NorthwindDataContext の部分クラスが表示されます。

  3. 検証メソッドを作成します。 サンプルコードのため、System.Exception例外を発生させていますが、
    本来は別の例外(あるいは独自例外)を発生させるべきかと思います。

  4. NorthwindDataContextの部分クラスに部分メソッドを追加し、検証コードを呼び出す コードを記述します。
    "partial " までタイプすると、"partial " までタイプすると、インテリセンスが働き、
    メソッド一覧が表示されますので、UpdateXxxxxx を選んでください。Xxxxxx は検証をしたいクラス名です。
    すると、以下のようなコードが挿入されます。
  5. メソッドに検証メソッドの呼び出しと、DB更新のコードを追加します。
  6. 同様に、InsertCustomerを追加します。

ExecuteDynamicInsertUpdateメソッドを呼び出すのがカギです。
なぜか、MSDNライブラリの以下のページには、このことが書いてありません。
http://msdn.microsoft.com/ja-jp/library/bb629296.aspx
これで、NorthwindDataContextクラスに検証機能を組み込むことができました。

DBを更新する側のコードを示します。

この例では、SubmitChanges メソッドを呼び出すと、InsertCustomer メソッドが呼び出され、
検証ロジックが動いた後、行が挿入されます。
★の行をコメントにして実行すると、検証で例外が発生します。


この記事へのコメント
有益な情報ありがとうございます。
更新ロジックにストアドプロシージャを使用した場合にパーシャルメソッドが使えないのですがどうすればよいのやら…
Posted by tsuto at 2011年02月10日 21:58
たぶん、UpdateXxxxxというパーシャルメソッドそのものが
ストアドプロシージャ呼び出しのメソッドに置き換えられて、
呼ばれなくなってしまうからですね。
このパーシャルメソッドから、ストアドプロシージャを
呼び出してみるとか...

Posted by Gushwell at 2011年02月10日 23:00
やっぱりそれしかないですよね…
せっかく更新ロジックにストアドを使用する仕組みがあるのに、オプティミスティック同時実行への対応ができていないなんて残念で仕方ありません。
Posted by tsuto at 2011年02月12日 23:40
そうですね。オプティミスティック同時実行で、検証用パーシャルメソッドとストアドを両方利用することは、ちょっと難しいかもしれませんね。
MSDNも見てみましたが、そういった情報は見当たりませんでした。

Posted by Gushwell at 2011年02月13日 09:32
 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/52117323