連載:ADO.NET Entity Framework入門第6回 EF4によるN層アーキテクチャと自己追跡エンティティ【前編】WINGSプロジェクト 土井 毅 著/山田 祥寛 監修2010/12/03 |
|
前回は永続性非依存(Persistence Ignorance)原則について解説し、実際にPOCO(Plain Old CLR Object)によるエンティティ・クラスをPOCO Entity Generatorを用いて生成することができた。今回はN層アーキテクチャにおいて、Entity Frameworkをどのように活用できるかを解説する。
特に、.NET Framework 4よりサポートされた「自己追跡エンティティ(Self-Tracking Entity)」という機能を使用することにより、N層アーキテクチャでのエンティティの変更履歴管理がどのように行われるかに注目する。
.NET Frameworkでの3層アーキテクチャ
前回でもN層アーキテクチャについて解説したが、.NET Frameworkで3層アーキテクチャを採用する場合、図1のような構成が考えられる。
図1 .NET Frameworkでの3層アーキテクチャの例 |
このような3層アーキテクチャにおいて、データ層でEntity Frameworkを使用する場合は、ビジネス層でPOCOによるエンティティ・クラスを使用することで、前回考えた永続化非依存原則に沿った設計が可能だ。また、POCOによるエンティティ・クラスを用いることで、プレゼンテーション層においても、永続化技術に依存しない実装を行うことができる。
例えばSilverlightはEntity Frameworkを直接サポートしているわけではないが、Webサービス経由でPOCOによるエンティティ・クラスのインスタンスを受け取り、変換などを行うことなく、そのまま扱うことができる。
ただし、POCOによるエンティティ・クラスは、そのままでは変更履歴の管理ができないという問題がある。まずは変更履歴管理の必要性について考えよう。
■変更履歴管理とは
データの更新処理を伴うアプリケーションで問題となるのは、データの変更履歴管理である。変更履歴管理とは、特定のデータの状態がデータベースから読み込んだ状態のままか、あるいは変更/削除/追加されたものか、といった情報の管理である。アプリケーションが常にデータベースと接続している場合には不要であるが、Webアプリケーションのように、データベースからいったんメモリ上にデータを読み込んだうえで編集を行う場合には必要な機能である。
例えば、ADO.NETのデータセット(DataSetクラス)には変更履歴管理の機能が付いており、データベースの行を表すDataRowクラスのDataRowStateプロパティで、その行の変更履歴を管理できる。DataTableオブジェクトへの変更をデータベースに書き戻す際には、この変更履歴情報を基に、必要な行だけが更新されることになる。
しかし、データベースのフィールドを定義しただけのPOCOによるエンティティ・クラスの実装では、当然ながら各プロパティの現在の値しか保持することができず、変更履歴を管理することはできない。
例えばデータベースから複数の行を読み込んだ後、データの追加/修正を行ったとしよう。図2では「ID:1」のレコードを修正、「ID:4」のレコードを追加している。
図2 エンティティ・クラスにおける変更履歴管理あり/なしの違い |
この図2の左側のように、変更履歴がない場合、どのエンティティが変更されたかを見分けることはできない。従って、データベースへこれらの行を書き戻す処理の実装は複雑なものになってしまう。
一方、図2の右側のように、変更履歴が管理されているならば、「ID:1」は変更ありなのでSQLのUPDATE文で更新処理を、「ID:4」は追加されているのでINSERT文で追加処理を行う必要がある、と判断できる。
データを参照するだけであれば変更履歴管理は必要ないが、更新処理を行う際には重要な機能であることが分かるだろう。
■自己追跡エンティティとは
さて、.NET Framework 4のEntity Frameworkにおいて、新たにサポートされたのが「自己追跡エンティティ(Self-Tracking Entity)」である。
自己追跡エンティティとは、POCOによるエンティティ・クラスに、変更履歴管理機能を追加したものである。自己追跡エンティティはPOCOによるエンティティ・クラスと同様、Entity Frameworkに依存しておらず、SilverlightのようなEntity Frameworkをサポートしていない環境でもそのまま扱うことができる。
実際の挙動は、図3のように、エンティティのプロパティへの書き込みが行われた際に、変更履歴を記録する処理が追加されている。
図3 自己追跡エンティティの挙動。プロパティへの書き込みの際に変更履歴を記録 |
なお、前述のようにADO.NETのデータセットには変更履歴管理機能が付いているのに、あえて新しい機能がサポートされた理由としては、
- データセットのシリアライズ/逆シリアライズは処理コストが高い
- データセットのシリアライズしたデータはさまざまな言語での相互運用性が低い
といった点が挙げられる。
Silverlightにおいても現時点ではデータセットはサポートされていないため、クライアントにSilverlightを使用する際にはPOCOベースの自己追跡エンティティを用いる必要がある。
以降では、自己追跡エンティティの実装内容についてサンプルのコードで確認する。
INDEX | ||
ADO.NET Entity Framework入門 | ||
第6回 EF4によるN層アーキテクチャと自己追跡エンティティ【前編】 | ||
1..NETでの3層アーキテクチャ/変更履歴管理とは/自己追跡エンティティとは | ||
2.自己追跡エンティティを使った3層アーキテクチャ・サンプル | ||
3.自己追跡エンティティの実装を確認/【コラム】自己追跡エンティティはPOCO? | ||
「ADO.NET Entity Framework入門」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|