ADO.NET Entity Framework ってナニ?
SQL Server 2008 や SQL Server Compact 3.5 SP1 で、 ADO.NET Entity Framework がサポートされるようになりました。
※ …あれっ!? これって、 .NET Framework 3.5 SP1 での追加機能で、 データベースは関係無いんじゃ…? f(^^;;;
ともあれ。
Entity Framework ってナニ? って人に。 いくつか日本語情報が出てます。
それらの中から、 MSDN マガジン 7月号より。
ADO.NET
Entity Framework で柔軟なデータ モデリングを実現する
Elisa FlaskoADO.NET Entity Framework を実際に背後で支えているのは、 Peter Chen 博士の Entity Relationship (ER) モデルに基づく Microsoft® Entity Data Model (EDM) です。 また、 Entity Framework を市場の他の ORM 型テクノロジから差別化する最も大きな要因となっているのも、 この EDM です。
EDM では、 データを格納する方法に合わせるのではなく、 組織がデータについて考え、 それを使用する方法に合わせて、 ドメイン モデルを定義できます。
※ データを格納する方法 ( テーブル ) に合わせなくってもいいんですって、 奥さん! (^^;
基になるデータ ストアに明確にマッピングできるだけでなく、 プログラミングに適したアプリケーション レベルのドメイン モデルを表現できるようなモデルを作成する中で、 EDM は継承やポリモーフィズムなどの概念をモデリングできる必要がありました。
※ 継承やポリモーフィズムですよ、 奥さん! (^^;
次の例は、1 つ以上のブログ ポストを含んでいるすべてのブログと、関連付けられた Person (このモデルの場合はブログ所有者) を取得する、 単純な ESQL クエリです。
select c, c.Person
from travelEntitiesGeneral.Blogs as c
where c.BlogPosts.Count > 0
※ ここで travelEntitiesGeneral は EntityConnection オブジェクトで、 とりあえず DB 接続のようなものだと思っておけばよいかと。
Blogs は Blog 型のオブジェクトのコレクション。
Blog 型のオブジェクトは、 複数の BlogPost 型オブジェクトと、 一人の Person 型オブジェクトを持てます。
Blogs から選択しているので、 c には Blog 型のオブジェクトが入ります。
SELECT される 1つの 「レコード」 には、 Blog 型のオブジェクトと、 その所有者である Person 型のオブジェクトの両方が含まれることになります。
実際には、 次のようなコードになるようです。
図 5 EntityClient に対する ESQL を使用したクエリ
using (EntityConnection conn =
new EntityConnection(
"name=travelEntitiesGeneral"))
{
conn.Open();
EntityCommand cmd =
conn.CreateCommand();
cmd.CommandText = @"select c.BlogID
from travelEntitiesGeneral.Blogs
as c
where c.BlogPosts.Count > 0";
EntityDataReader reader =
cmd.ExecuteReader(
CommandBehavior.SequentialAccess);
while (reader.Read())
{
Console.WriteLine("BlogID = {0}",
reader["BlogID"]);
}
conn.Close();
}
※ 上の例では、 型無しの結果が返ってきます。 次のように、 型指定も可能だそうです。
厳密に型指定された ObjectContext を使用して構築されたクエリを図 8 に示します。 この例では、 クエリ言語として LINQ が使用されています。 厳密に型指定された ObjectContext を使用すると、 プロパティが EntitySet ごとに公開されるため、 プロパティを見つけやすくなります。たとえば、 travelEntities.CreateQuery<BlogPost>("travelEntitiesGeneral.BlogPosts") の代わりに travelEntities.BlogPosts が使用されます。
図 8 厳密に型指定された ObjectContext によって構築したクエリ
using (MyTravelPostEntities
travelEntities = new MyTravelPostEntities())
{
BlogPost post = (from bp in
travelEntities.BlogPosts
.Include("Comments.Person")
.Include("Blog")
where bp.Blog.BlogID
== requestedBlog.BlogID
orderby bp.BlogDate descending
select bp).First();
return post;
}
※ これは、 つまり… Include しなかったエンティティやプロパティは null で返って来る、 ということかな?
上の式は、 指定された Blog の全ての BlogPosts (投稿) を、 BlogPosts の BlogDate でソートして最新のBlogPost オブジェクトを取り出すのですね。 その BlogPost オブジェクトには、 Blog オブジェクトと Comments.Person オブジェクトは含まれるけど、 たとえば Comments.CommentText オブジェクトなどは含まれないのでしょう。 ( …たぶん f(^^; )
※ この blog 内の関連記事
→ [.NET] Entity Framework は .NetFramework 3.5 SP1 に入るらしい
→ [.NET] LINQ があるのに、 なぜ Entity Framework なんてものも出てきたのか?
| 固定リンク
« SQL Server Compact 3.5 SP1 リリース | トップページ | [.NET] Re^2: フィードバック - VB: Option Strict On でも、 For Each で暗黙的な縮小変換が実行される »
「プログラミング」カテゴリの記事
- 【.NET / Win8.1 ストアアプリ】 HttpClient で TLS 1.1 / 1.2 に対応するには(2018.06.17)
- 【VS2017 15.7pv2】 XAML のランタイム ツールに 「ヒートマップ」 が増えた(2018.03.28)
- 【.NET Core】 プロジェクトを作ると 「project.assets.json が見つかりません」 エラー(2018.02.10)
- 【#UWP】 ビットマップの表示色を変える (Win2D.uwp 経由で Direct2D を使う)(2017.08.23)
- 【#UWP】 CompactOverlay モード: Picture in Picture というか、「最前面に表示」するウィンドウを作る(2017.08.16)
この記事へのコメントは終了しました。
コメント