前回は、SubSonicによって生成されたコードを使って効率的にプログラミングする方法について紹介しましたが、今回は開発で役立つ情報をTIPS的に紹介します。
トランザクション制御
SubSonicでトランザクション制御を行う場合、自動トランザクションを使用します。手順としては、System.Transactionsに参照設定を追加してから、その中のSystem.Transactions.TransactionScopeクラスを利用します。コードとしては、次のようなイメージになります。
トランザクション管理のコード例
using (TransactionScope scope = new TransactionScope()){
try{
出版社 pub = new 出版社();
pub.Id = 50;
pub.名前 = "味覚出版社";
pub.Save(); //保存1
書籍 book = new 書籍();
book.Id = 100;
book.名前 = "おろし蕎麦入門";
book.価格 = 2000;
book.出版社ID = 50;
book.Save(); //保存2
scope.Complete(); //コミット(成功)
}catch (System.Data.SqlClient.SqlException ex){
System.Diagnostics.Debug.Write(ex.ToString());
} //ロールバック(失敗)
}
TransactionScopeクラスのCompleteメソッドを呼び出すと、トランザクションがコミットされます。もし、呼び出さないとトランザクションは中止されロールバックされます。このサンプルの場合、書籍データの保存時に主キー重複などのエラーが発生すると、出版社のデータも保存されずにロールバックされます。
パーシャルクラスによる機能の追加
生成されたクラスに機能を追加したい場合には、パーシャルクラスを作成すると良いでしょう。パーシャルクラスとは、クラスのコードを複数のファイルに分けて記述できる機能です。本稿のプロジェクトの場合、genフォルダにコードが生成されますので、genフォルダ以外の場所に、パーシャルクラス(書籍クラスや出版社クラス)を作成すると良いでしょう。
genフォルダのファイルは生成するたびに上書きされてしまいますが、パーシャルクラスのファイルは変更されないので、コードを保持することができます。この例ではValidateメソッドと表示用のプロパティを記述しています。
データ保存時の妥当性チェック
上のパーシャルクラスの例では、ActiveRecordクラスのValidateメソッドをオーバライドしています。このValidateメソッドはSaveメソッドの前にデータの妥当性チェックのために呼び出されるメソッドです。
そのため、テーブル固有のチェックがあれば、このValidateメソッドに記述すると良いでしょう。もしエラーがある場合は、戻り値にfalseを設定すればデータは保存されません。
同様に、BeforeInsert(データの追加前)/BeforeUpdate(データの更新前)/BeforeValidate(妥当性チェック前)/AfterCommit(保存後)/Loaded(ロード後)といったメソッドをオーバーライドして、任意の処理を追加することができます。
テンプレートの変更
パーシャルクラスによる機能拡張ではなく、生成コードを変更したいというケースもあるかもしれません。このような場合には、生成コードのテンプレートを差し替えることができます。テンプレートは「C:\Program Files\SubSonic\SubSonic 2.1 Final\src\SubSonic\CodeGeneration\Templates」にあり、このファイルはSubsonic.dllに埋め込まれています。
このテンプレートをカスタマイズするには、上のフォルダをコピーして、ファイルの中身を書き替えます。そして、Web.config(App.config)のtemplateDirectoryパラメータでその場所を指定すれば、新しいテンプレートを元にコードを生成してくれます。
調査に適したツール
SubSonicで作ったコードの動作をチェックしたい場合、SQLの実行状況をトレースできるツールが役立ちます。SQL Serverの場合「SQL Server Profiler」を利用すると良いでしょう。
SubSonicではコードを自動生成しているため、気付かないうちにSQLを大量に発行していることもあります。このような場合にトレース可能なツールがあると問題の解決に役立ちます。