« SQL Server Compact 3.5 SP1 リリース | トップページ | [.NET] Re^2: フィードバック - VB: Option Strict On でも、 For Each で暗黙的な縮小変換が実行される »

2008年8月 8日 (金)

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 Flasko

ADO.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 で暗黙的な縮小変換が実行される »

プログラミング」カテゴリの記事

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: ADO.NET Entity Framework ってナニ?:

« SQL Server Compact 3.5 SP1 リリース | トップページ | [.NET] Re^2: フィードバック - VB: Option Strict On でも、 For Each で暗黙的な縮小変換が実行される »