「マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
目次 †
概要 †
.NET Framework 3.5 SP1で追加されたデータベースアクセステクノロジー
- Entity Frameworkは、TableAdapter と比べ、より高次の機能を提供し、高い生産性を誇る RAD ツールです。
- データアクセス部分を隠ぺいするため、データベースの種類や構造を意識することなくプログラミングできます。
- 反面、実際に発行される SQL 文の構築は Entity Framework に委ねられます。
- このため、チューニングや、柔軟なデータの参照・更新が課題になりやすく、
ミッション クリティカルなエンタープライズ システム開発には適合しないことがあります。
概念モデルに対してプログラミング †
Entity Frameworkは、インピーダンス・ミスマッチ問題を解決するため、
エンティティを定義し、エンティティ経由でデータベースへアクセスするための手段を提供する技術。
- 概念モデルであるEntity Data Model(EDM)を開発者が柔軟にモデリング可能。
RDBに対して直接プログラミングする代わりに、EDMに対してプログラミングする。
- これにより、テーブルとオブジェクトを1対1に対応させるO/Rマッパとは異なり、
「結合(Join)」というRDB固有の事情に振り回されることなく、
より直感的に必要な情報を取得することが可能になる。
- RDB側のスキーマ変更(特にテーブルの分割/統合のような変化)に対して耐性がある。
- EntityはADO.NET 非接続型と同様に、多階層のアプリケーションを開発する場合、
オブジェクトとして渡すことが可能でありDTO(Data Transfer Object)として利用できる。
Entity Data Model(EDM) †
CSDL、SSDL、および MSL 仕様
http://msdn.microsoft.com/ja-jp/library/vstudio/bb399604.aspx
- 概念スキーマ定義言語 (CSDL) <---> マッピング仕様言語 (MSL) <---> ストア スキーマ定義言語 (SSDL) は
XML ベースの言語で、それぞれ概念モデル、モデル間のマッピング、ストレージ モデルについて記述する。
- Entity Data Model(EDM) の定義は、Entity Data Model デザイナーにより、
設計時にモデルとマッピングの情報を *.edmx ファイルに保存する。
- Entity Data Model デザイナーは、ビルド時に EDMファイル(*.edmx)の情報を使用して、
Entity Framework が実行時に必要とする *.csdl、*.ssdl、および *.mslファイルを作成する。
CSDL †
CSDL(Conceptual Schema Definition Language:概念スキーマ定義言語)
概念スキーマ(概念モデル)
MSL †
MSL(Mapping Schema Language:マッピング・スキーマ言語)
CSDLとSSDL(モデル間)のマッピング
SSDL †
SSDL(Storage Schema Definition Language:ストア・スキーマ定義言語)
ストレージ・スキーマ(ストレージ モデル)
xxx ファースト †
- エンタープライズではほぼ、DBファーストを採用する。
- 単純なテーブル(データストア)しか使用しない
EUCなどの世界では、モデルファーストもマッチする可能性がある。
モデルファースト †
モデル(EDM)からDBMSのスキーマを生成する方法
- 連載:ADO.NET Entity Framework入門 - @IT
DBファースト †
DBMSのスキーマからモデル(EDM)を生成する方法
コードファースト †
- ADO.NET Entity Framework 4.1 で登場した機能。
- Entityへのデータ構造の定義が、そのままデータベースのテーブル設計となる。
- ASP.NET MVC のModel(Entity)でデータ構造を定義すると、
その定義に従ってデータベースにテーブルが作成される。
- ソースコードのみで完結し、
Entity Framework のEntity Data Model (EDM) などを
明示的に作成する必要がなくなるため、より迅速な開発が可能となる。
CRUD処理 †
ここでは、「context」がDbContext?を継承したコンテキストを指している。
サンプルプログラム次第で、context, db, dbContextなどの名称が使用される。
仕組み †
Entity States †
Entityは以下のEntity Statesを持っており、
- Unchanged状態
追跡開始後に変更されていない状態
SaveChanges?()メソッド †
SaveChanges?()メソッドを呼び出した際に、
コレを更新系SQLに変えて実行すると言う、ある種、
RowState? + TableAdapter的な仕組みで動作している。
参照系 †
LINQは遅延評価 †
LINQは遅延評価なので、結果が必要になるまではSql文が発行されない。
ToArray()メソッドや、Load()メソッドを使うと、
即時実行されて結果をメモリに起こす事ができる。
オブジェクト参照 †
オブジェクト参照によりSQLが実行される。
using (var context = new XXXXXContext())
{
foreach (var YYYYY in context.YYYYYs)
{
Console.WriteLine(YYYYY.Name);
}
}
単一要素取得のLINQメソッド †
- Find()メソッド
- 主キーを使用して検索する。
- DbContext?にキャッシュがあれば、それを検索する。
- キャッシュがない or キャッシュ内にデータが無い場合、SQLで検索する。
以下の様な感じ。
詳しくは、LINQ to Objectを参照。
以下の様な感じ。
context.YYYYYs.Where(x => x.Id == "1");
context.YYYYYs.Where(x => x.Name == "hogehoge").ToArray();
注意 †
全体的に実行されるSQLがブラックボックスで性能を意識し難い。
更新系 †
Insert †
using (var context = new XXXXXContext())
{
// YYYYY Entity の Statesが
// Unchanged状態→Added状態へ。
context.YYYYYs.Add(new YYYYY
{
プロパティ名1 = 値1,
プロパティ名2 = 値2,
});
// SaveChanges→Added状態の
// YYYYY EntityがInsert文に替えられる。
context.SaveChanges();
}
Update †
using (var context = new XXXXXContext())
{
var yyyyy = context.YYYYYs.Single(x => x.Name == "hogehoge");
yyyyy.Name = "Aiueo";
context.SaveChanges();
}
Delete †
参考 †
LINQ to Entities †
LINQ to Entities, QueryBuilder?, Entity SQL
@IT †
- 連載:ADO.NET Entity Framework入門 - @IT
http://www.atmarkit.co.jp/fdotnet/ef4basic/index/index.html
- 第1回 最新DBアクセス・フレームワークの基本的な考え方
- 第2回 EDMにおける多対多関係とEntity Frameworkでのデータの取得/保存
- 第3回 Entity Frameworkにおけるクエリと更新
- 第4回 データベースからのEntity Data Model生成
- 第5回 POCOによるエンティティ・クラス
- 第6回 EF4によるN層アーキテクチャと自己追跡エンティティ【前編】
- 第7回 EF4によるN層アーキテクチャと自己追跡エンティティ【後編】
Microsoft Docs †
MSDN †
magazine †
blogs †
- 雲のごとく - Site Home - MSDN Blogs
- ADO.NET Entity Framework | slideshare
比較関連 †
Tags: :.NET開発, :データアクセス, :ADO.NET, :Entity Framework