特集:Visual Studio 2008 SP1新機能解説(2).NETの新データアクセス・テクノロジ「ADO.NET Entity Framework」WINGSプロジェクト ナオキ/山田 祥寛2008/11/28 |
|
|
Entity Framework概要
Visual Studio 2008 SP1(以降、VS 2008 SP1)によるアップデートでは、新たなデータアクセス・テクノロジとして「ADO.NET Entity Framework」(以降、Entity Framework)が追加された。本稿ではこのEntity Frameworkの概要と、その活用方法について解説する。
■Entity Framework登場の背景
Entity Frameworkの中身を解説する前に、まずはデータアクセスにおける従来技術の問題点について確認しておこう。
現在では、オブジェクト指向プログラミングとリレーショナル・データベース(RDB)を組み合わせた開発は一般的な方式である。しかしながら、オブジェクト指向により抽象化したオブジェクト・モデルとデータベースのテーブル構造とは、そもそもの構造が異なる。
オブジェクト指向に基づいてデータベース・アクセスを行おうとする場合、例えばINSERT命令を発行するには、データベースに格納すべき値をオブジェクトから取り出し、INSERT命令を動的に組み立てる必要がある(1つのオブジェクトをテーブル内の1レコードに対応させる場合)。逆に、SELECT命令でデータベースから取り出した結果セットは、オブジェクトを生成してから、結果セット内の各値を対応するオブジェクトのプロパティに代入しなければならない。
このような相互マッピングのためのコードは、実に企業アプリケーション全体の3〜7割まで占めるともいわれ、開発生産性を低下させる一因ともなっている。このような問題を「インピーダンス・ミスマッチ」という。
図1 異なるデータモデルが引き起こす「インピーダンス・ミスマッチ」 |
このようなインピーダンス・ミスマッチを解消する技術として、これまで定番とされてきたものが「O/Rマッピング(Object/Relational Mapping)」である。O/Rマッピングとは、その名のとおり、オブジェクトとRDB(のテーブル)とを結び付けることをいう。具体的には、クラスのプロパティとテーブル上のフィールド(テーブルの列)とをマッピングする。前述したように、オブジェクトとRDBのテーブルとの間には構造上のギャップが存在するが、このギャップを機械的に埋めようというのがO/Rマッピングの考え方だ。
もっとも、従来のO/Rマッピング技術では、オブジェクト指向のクラスをRDBのテーブルに1対1でマッピングしていたにすぎない。ここで問題となるのが、データベースは高度に正規化されているという点だ。
例えば書籍情報データベースを考えてみよう。正規化を考慮して設計すると、実際には書籍の基本的な情報(書名やページ数、刊行日など)はbookテーブルに、著者情報(著者名や住所、経歴など)はauthorテーブルに、出版社情報(出版社名や住所、会社情報など)はpublishテーブルに……というように、アプリケーション側からすれば情報が分散されていることになる。つまり、書名と著者名と出版社名が必要となる場合、アプリケーション側では、毎回、分散されている情報に対して「結合」(Join)という処理を行わなければいけなかったわけだ。
もちろん、これはアプリケーション側からすれば、極めて「面倒な」ことだ。また、そもそもアプリケーションがデータベースの構造(データの持ち方)を意識しなければならないということは、それだけデータベースの変更に影響を受けやすいということを意味する。
しかし、書名、著者名、出版社名といったプロパティを持つ「書籍エンティティ」があらかじめ用意されていたとしたらどうだろう(エンティティとは、ここではオブジェクトとほぼ同義であると考えて構わない)。アプリケーションからは、書籍エンティティにアクセスすることで、「結合」などというRDB固有の事情に振り回されることなく、より直感的に必要な情報を取得することが可能になる。もちろん、エンティティという皮を1枚かぶせることで、RDB側のスキーマ変更――特にテーブルの分割/統合のような変化にもより耐性が高まることになる。
Entity Frameworkとは、要は、このようなエンティティを定義し、データベースへアクセスするための手段を提供する技術であると考えればよいだろう。
■Entity Data Modelとは?
より具体的に、Entity Frameworkの中身を見ていこう。
Entity Frameworkを実際に利用するには、「ADO.NET Entity Data Model」(以下、EDM)を利用することになる。このEDMこそ、Entity Frameworkの一番のキモであり、実際の開発における最重要項目となる。EDMは、次の3つの要素で構成されている。
- CSDL(Conceptual Schema Definition Language:概念スキーマ定義言語)
- MSL(Mapping Schema Language:マッピング・スキーマ言語)
- SSDL(Storage Schema Definition Language:ストア・スキーマ定義言語)
SSDLはRDBとの1対1のマッピング情報(=ストア・スキーマ)を、CDSLはエンティティが持つプロパティ情報(=概念スキーマ)を、それぞれ定義するものだ。そして、MSLはこれらCSDLとSSDLをマッピング(橋渡し)する役割を担っている(図2)。VS 2008 SP1では、「Entityデザイナ」を利用することで、EDMの定義をGUI画面から直感的に行うことができる。
図2 Entity Frameworkが行うストア・スキーマと概念スキーマのマッピング |
このように定義したEDMに対しては、クエリ(後述しているが、Entity SQLやObject SQLなどがある)を発行することにより必要なデータを得ることができるが、これにはEntity Client/Object Servicesというデータ・プロバイダを利用する。
EDMに対して発行されたクエリは、LINQ to SQLと同様にRDBで実行される。EDMでは、記述されたクエリを同等のSQLクエリに変換し、データベースに送信し、処理するわけだ。
図3 Entity Framework全体像 |
EDMに対して問い合わせを行うには、Entity Client/Object Servicesというデータ・プロバイダを使用する。Entity SQL、Object SQL、LINQ to EntitiesはいずれもEDMに対する問い合わせ言語(技術)の一種(詳細は後述)。 |
■Entity Framework対応のデータ・プロバイダ
現時点でVS 2008 SP1で提供されるEntity Framework用のデータ・プロバイダは、SQL Serverのみをサポートしている。SQL Server以外のデータ・プロバイダについては、現在のところ、Devart社(米国)がOracle/MySQL/PostgreSQL対応のものを販売している。それぞれ149.95〜249.95ドルとなっているが、トライアル版も提供されているので、それらのデータベースでもしEntity Frameworkを使うのであれば、導入を検討してみるとよいだろう。
ほかにも、米IBM、米OpenLink Software、米Sybaseなどの企業が、Firebird、DB2、Informix Dynamic Server、SQLite、SQL Anywhere、Sybase、VistaDBなどのサポートを表明している。ただし、Oracleから提供されているODP.NETは、現在のところEntity Framework対応を明言していない。
以上大まかではあるが、Entity Frameworkの全体像をつかんでいただけたかと思う。以降は実際にEntityデザイナを利用してEDMを設定する方法、そして、実際にアプリケーションからEDMにアクセスする方法について解説する。
INDEX | ||
Visual Studio 2008 SP1新機能解説(1) | ||
DBアプリをコーディングレスで構築する「ASP.NET Dynamic Data」 | ||
1.Dynamic Dataアプリケーションの基本 | ||
2.データ・モデルの作成/Global.asaxの編集 | ||
3.メタデータ編集によるDynamic Dataアプリケーションのカスタマイズ | ||
4.自作ユーザー・コントロールの利用/ページ・テンプレートのカスタマイズ | ||
Visual Studio 2008 SP1新機能解説(2) | ||
.NETの新データアクセス・テクノロジ「ADO.NET Entity Framework」 | ||
1.ADO.NET Entity Framework概要 | ||
2.Entity Data Model(EDM)の作成と利用 | ||
3.EDMに対するクエリの利用方法(Entity SQL) | ||
4.EDMに対するクエリの利用方法(Object Services/LINQ to Entities) | ||
Visual Studio 2008 SP1新機能解説(3) | ||
RESTスタイルのWebサービスを手軽に公開する「ADO.NET Data Services」 | ||
1.ADO.NET Data Services概要/対応するクライアント | ||
2.サンプル − ADO.NET Data Servicesの公開 | ||
3.ASP.NET AJAX環境のデータを取得/追加する | ||
- 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|