FC2ブログ
まだ生きているようです

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
-------- : スポンサー広告 :
Pagetop

EntityFramework:いろいろなマッピングの例2

今回は継承について紹介します。

Entity Data Modelでは、以下2種類の継承が可能です。
・Table-Per-Type (TPT)
・Table-Per-Hierarchy (TPH)

継承を使用すると、概念モデルをよりオブジェクト指向的に定義する事が可能になりますが、エンティティとテーブルスキーマの考え方が別物になるなど、当然トレードオフがあるので注意が必要です。

・Table-Per-Type (TPT)
エンティティにマップされる、別個のテーブルを使用して、非継承プロパティと継承階層のそれぞれの型のキー、プロパティのデータを維持する方法です。と書いても意味が分かりにくいので下図をご確認下さい。

20101002_EF1.jpg

・Table-Per-Hierarchy (TPH)
1 つの テーブルを使用して、継承階層のすべてのエンティティ型のデータを維持する方法です。単一テーブル継承とも呼ばれます。こちらも下図をご確認ください。

20101002_EF2.jpg

TPHを実現するには、多少の手順が必要になります。

例えば、DataBase Firstで以下のようなエンティティが出来上がったとします。
20101002_EF3.jpg
このエンティティは、Employeesテーブルがもとになっていて、ユースケースとして、Employeeのほかに、OperatorとAdministratorと言うアクターが存在し、Employeesテーブルに一緒に保存されている状況です。

そこで、OperatorエンティティとAdministratorエンティティを作成します。(親のエンティティはemployeeにします)

20101002_EF4.jpg

次に、Operator(Administrator)にしかない情報(スカラプロパティ)を親のemployeesから切り取り⇒貼り付けを行います。
また、employeeFlgも削除してしまいます。その結果以下のようになります。

20101002_EF5.jpg

employeeFlgが0の場合はemployee、1の場合はOperator、2の場合はAdministratorというルールを実現したいので、マッピングの詳細をそれぞれ3つのエンティティクラス上で行います。(下図はAdministratorのマッピングです)
20101002_EF6.jpg

これでEDMの作成は終了です。

コードは以下のようになります。(このコードは、TPT、TPH双方で使用することが可能です。)
この例は、Employee1人、Operator1人、Administrator1人を追加して、Operatorを全員抽出しています。
using (Demo2Entities db = new Demo2Entities())
{
     employee newEmployee = new employee();
     newEmployee.ID = 11;
     newEmployee.Name = "社員1";
     db.employees.AddObject(newEmployee);

     Operator newOperator = new Operator();
     newOperator.ID = 502;
     newOperator.Name = "オペレーター1";
     newOperator.Ope_Desc = "オペレーター用の備考";
     db.employees.AddObject(newOperator);

     Administrator newAdministrator = new Administrator();
     newAdministrator.ID = 302;
     newAdministrator.Name = "管理者1";
     newAdministrator.Admin_Desc = "管理者用の備考";
     db.employees.AddObject(newAdministrator);

     db.SaveChanges();

      var query = from o in db.employees.OfType<employee>()
                          select o;

     foreach (var q in query)
     {
          Console.WriteLine(q.Name);
     }
}

ちなみに、Model First での継承は、必然的にTPTになるはずです。
(ただし、TPHが絶対不可能なわけではありません)
また、Database First での継承は、テーブルスキーマーによってTPTとTPHを使い分けることになります。
ただ、TPHは実テーブルスキーマから乖離するので注意が必要ですね。


スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

tag : EntityFramework

2010-10-02 : EntityFramework : コメント : 0 : トラックバック : 0
Pagetop
コメントの投稿
非公開コメント

Pagetop
« next  ホーム  prev »

カレンダー

プルダウン 降順 昇順 年別

09月 | 2018年10月 | 11月
- 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 - - -


カテゴリ

openclose

タグクラウドとサーチ

メールフォーム

名前:
メール:
件名:
本文:

プロフィール

こだかたろう

元MSの小高と申します。
(↓こんな人です。)
こんな見た目です

ずっとエバンジェリストをしていましたが、この度転身いたしました。
よろしくどうぞ。

Select Template

RSSリンクの表示

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。