技術日記
技術調査記録Edit

.NETの新データアクセス・テクノロジ「ADO.NET Entity Framework」 - @IT

ADO.NET Entity Frameworkのお勉強の続き。ASP.NET MVCを使うつもりなので、ASP.NETを使うフロント側の情報は参考にならないなー。

EDM(Entity Data Model = Entiry Frameworkで生成するデータアクセスモデル)でクエリを発行する3つの方法

  • Entity SQL + Entity Client
  • Query Builder(Object SQL) + Object Services
  • LINQ to Entities + Object Services
Entity SQLってのが一番低レベルなDBラッパーらしいけれども、Entity Framework専用クラスになっている辺りがいやらしいな。EntityClientとSqlClientは相似なクラスとして、
  • アクセス対象 DBサーバー自体 → EDM
  • データ接続クラス SqlConnection → EntityConnection
  • SQLコマンドクラス SqlCommand → EntityCommand
  • データリーダークラス SqlDataReader → EntityDataReader
という関係のようだ。ただ、機能的にはEDM向けに拡張されているらしい。ただし、Entity SQLではSELECTしかサポートしてないんだと。INSERT、UPDATE、DELETEしたい場合はどうするんだろう? SqlClientを使うの?

しかも、Entity SQL/Query Builderで利用できるステートメントという表とその後の説明を読むと、ここで書けるSQL文ってのは、RDBに直接渡されるものではなく、Entity Frameworkの実行エンジン内にあるSQLパーサーで実行されるものってことか。

EDM向けのSQL文をEntityClientで発行すると、それがEDMを通して実際のRDB向けSQL文に変換されて実行されるというイメージなのね。うわー、なんか気色悪いなー。

Object Builderってのは、上記のEntity SQLをクラスライブラリ上にラッピングしたものね。サンプルコードを見ると、文字列とLINQライクなメソッドが混ざり合ってて、気色悪いコード表現になるなー。すげー使いたくない。

ただ、この方法でオブジェクトを操作して、SaveChangesメソッドを呼び出すと、オブジェクトを操作した結果をRDBに反映=更新・追加・削除できるそうな。ただ、その実際のコードは、

[sourcecode language="c#"]
using(pubsEntities objCtx = new pubsEntities())
{
  titles titlesEntity = new titles();
  DateTime dt = DateTime.Parse("2008/09/17");
  titlesEntity.pubdate = dt;
  titlesEntity.royalty = 8;
  titlesEntity.title = "Tamaki";
  titlesEntity.title_id = "NO311";
  titlesEntity.type = "Family";
  objCtx.AddObject("titles", titlesEntity);
  objCtx.SaveChanges();
}

using (pubsEntities objCtx = new pubsEntities()) { titles titlesEntity = new titles(); titlesEntity = objCtx.titles.Where("it.royalty = 8").First(); titlesEntity.title = "Tamata"; objCtx.SaveChanges(); }

using (pubsEntities objCtx = new pubsEntities()) { titles titlesEntity = new titles(); titlesEntity = objCtx.titles.Where("it.royalty = 8").First(); objCtx.DeleteObject(titlesEntity); objCtx.SaveChanges(); } [/sourcecode]

みたいな感じになるんだって。一応オブジェクト操作でRDB上のデータをコントロールできてるけど、こんなやり方とても直観的で便利になったぜ!とは思えないなー。

DB上の行に対応したデータオブジェクトを操作して更新するのではなく、データオブジェクトを操作した後に、それをEDM側に更新 ・追加 or 削除するよ、と通知して、EDM側でその結果を反映させるのか。

この記事の最後の方で、この記事が書かれた時点でのユーザーの評価が書かれているけど、かなりネガティブな感じだね。その後少しは状況は変わったのかな?

Visual Studio 2010上で普通にDB接続ウィザードを使ったら、Entity Framework用の定義が自動生成されたから、推奨フレームワークなんだろうとそのまま使おうとしてみたんだけど、これはやめた方が良さそうな予感。

Entity Frameworkがらみの機能はがっつり削除して、ほかの方法で作り直す。下手したらSqlConnection使ってべたにSQL文を組み立てて書いた方がましかもしれないなー。ちょっとEntity Framework以外の手法を調べてみる。

Published At2011-11-02 04:11Updated At2011-11-02 04:11