前編では、LightSpeedでモデルを作成してデータベースに反映させる方法を紹介しました。中編にあたる本編は、モデルから生成されたコードを利用して基本的な操作(追加、更新、参照、削除)を行う方法を紹介します。

生成されたコードの確認

まず、モデルから生成されたクラスを見てみましょう。生成されたクラスにはEntityとUnitOfWorkの2種類があります。

ドメインモデルを構築するEntityクラス

エンティティは、アイデンティティによって識別される一意のオブジェクトで、基本的にテーブルの1レコードが、1つのエンティティにマッピングされます。このエンティティに振る舞いを記述することで、ドメインモデルを構築していきます。

前回、デザイナーでDvdとRentalというエンティティを作成しましたが、これらはEntityという基本クラスを継承します。このEntityクラスには、ステータス(EntityState)、エラー情報(Error/Errors)、妥当性チェック(OnValidate)、保存イベント(Saving)といった多くのメンバが実装されています。

Entityのクラス図(DvdとRental)

エンティティは、ビジネス上の概念を表現する役割を担っており、UIやインフラストラクチャの実装に依存しません(Entityクラスが.NET Framework標準のIEditableObject、INotifyPropertyChanged、IDataErrorInfoといったインタフェースだけを継承しているのもそのためです)。

永続化とリポジトリを担うUnitOfWorkクラス

ドメインモデルでは、エンティティ自身が永続化の仕組みを持たないため、エンティティの生成や永続化の仕組みを別途考慮する必要があります。LightSpeedでは、この仕組みとしてUnitOfWorkというクラスを用意しています。

UnitOfWorkのクラス図(LsUnitOfWork)

UnitOfWorkでは、オブジェクトに対して行った変更を記録して、最終的な結果をデータベースに反映させることができます。また、LightSpeedのUnitOfWorkクラスは、ファクトリ(オブジェクトの生成処理)とリポジトリ(オブジェクトの集合をメモリ内で管理)の役割も果たします。

クラス図を見ているだけではイメージがわきにくいと思いますので、ここからはプログラミングしながら、エンティティとUnitOfWorkについて理解していきましょう。