ページ

2011年1月9日日曜日

.NET勉強中:ADO.NET Entity Framework入門 第2回 EDMにおける多対多関係とEntity Frameworkでのデータの取得/保存


第2回 EDMにおける多対多関係とEntity Frameworkでのデータの取得/保存


いきなり多対多関係でデモしているところがちょっとずるです。多対多関係は手動で正規化する場合でも中間テーブル(マップテーブル)を使いますから、それが自動生成されるのは便利な機能でしょう。試してみたのですが、1対多、多対1関係の場合でも中間テーブルが生成されてしまいます。1対多、多対1関係については、関係のエンドポイントのテーブルにリンク項目を持たせれば充分で中間テーブルは滅多に使わないでしょう。悪くとればそういう粗を見せないための多対多関係でデモしているように見えます。このあたりも自動化が中途半端な感じです。末尾のコラムでそのあたりに若干ふれていますが、マッピングツールとしてはそこそこの出来なのですが、設計ツールとしてはまだ機能不足の感が否めません。


この部分はVS2008のマッピングツールと同様で、DBコンテキスト(DBについて一つ)とエンティティクラス(テーブル毎)が生成されます。説明はエンティティ、DBコンテキストの順になっていますが、使う立場としてはDBコンテキストを先に解説して欲しいところです。オペレーション的にはDBコンテキストのインスタンス化から始まるわけですから。ただしVS2008とは名称が微妙に異なっています。

EDMからのDB生成はExpress版では手作業になってしまったので、今回は(以前に構築した)DBからオブジェクトへのマップを行ないます。手順は、プロジェクト→新しい項目の追加→ADO.NET Entity Data Model選択/追加→データベースから生成→データ接続選択→データベースオブジェクト選択→完了、で(指定したテーブルを取り込んだ)デザイナ画面が表示されます。この時にバックエンドでDBアクセス用のクラスが(edmxモジュール内に)生成されています。

ORマップによって生成されるクラスですが、VS2008ではデータコンテキスト、データオブジェクトとなっていたものが、VS2010ではそれぞれコンテキスト(クラス名としてはEntities付加)、エンティティ(クラス名はテーブル名から)と改名されています。それぞれの役割とかは同じで、名前だけ変更されたようです。まあ、MS,改名が大好きですからね。あと、マイナーな機能追加で、複数データを扱うものについては名称が複数形にできるようになっています。LINQ使うとテーブルからの選択なんかでコンテキスト.テーブル名複数形、といった形でテーブルに参照することになるので、複数形になっているだけでも気持ちのいいものです。

記事の方ではコンテキストにはContainer付加となっていますが、私が試したみたところEntitiesが付加された名前になっていました。記事の方はモデルからのDB定義、私が試したのは(諸般の事情により)DB定義からのオブジェクトマップ、なので、生成する方式によって付加される名前が異なるのでしょう。


基本的にはVS2008でのORマップされたクラスの使い方と同じです。ただし名前が微妙に異なっていますし、定義されているメソッドも微妙に異なっていました。記事のサンプルコードではコンテキスト(コンテナ)のAddToEntriesメソッドでデータを追加していますが、生成されたファイル(あるいはインテリセンス)ではこのメソッドは非推奨メソッドとされています。正しい追加手法は DBEntities.XXXEntries.AddObject(XXXEntry)のようです。

0 件のコメント:

コメントを投稿