ADO.NET Entity Frameworkでコードファースト
Entity FrameworkのCTPが出ていたのは知っていたのですが、やっぱり平日は時間が全く取れなく、、、ようやく先ほど確認できました。
こちらが新たに公開されたCTPです。
Microsoft ADO.NET Entity Framework Feature Community Technology Preview 4
これが一体何か?簡単に書いておきますね。
Entity FrameworkはVS2010になってVer.4となり、非常に沢山の機能追加がされました。
例えば、、、
・POCOサポート
・遅延実行サポート
・セルフトラッキングエンティティサポート
・モデルファースト
・・・
他にもたくさんありますが。。。
その中で、新たな開発スタイルを提供してくれたのが、モデルファーストです。
(従来EFでは、データベースありきで、そこからモデルをジェネレートするスタイルのみが可能でした。モデルファーストは、モデルを作った上で、そこからDB上のオブジェクトを作成するスタイルです。)
今回のCTPは、Ver.4に入れられなかった新しい開発のスタイルの提供が目的(のはず)です。 これはずばり、「コードファースト」になります。
以下が特徴です。
・デザイナやXMLのマッピング定義ファイルを使用しない開発
・ベースクラスを必要としないプレーンなクラス定義で書かれたシンプルなモデル定義
・CoC(Convention over Configuration):「規約は設定に勝る」をベースにした永続化
・規約を上書きして、永続化マッピングをフルカスタマイズできるAPI
つまり、デザイナーベースの開発スタイルである、「データベースファースト」「モデルファースト」に加えて、コードセントリックな「コードファースト」が新たに加わったと言うことになります。
ちなみに上記は、ScottGu's blogs(Code-First Development with Entity Framework 4 )からの情報を適当に意訳したものですが、
Scott Guthrieは以下のようにも書いています。
Code-First Development enables a pretty sweet development workflow.
「コードファースト」は、pretty sweet developmentなんですよ!
(実際やってみると非常によくわかります。 )
また、開発チームブログから「コードファースト」は、より開発生産性にフォーカスした手法と、通常の「コードファースト」の2つの方向性が提示されています。
以下では、開発チームブログにある、開発生産性にフォーカスした手法を紹介します。
EF Feature CTP4 Walkthrough: Productivity Improvements
プロジェクトにあるのは、以下のProgram.csのみです。他はなんにもありません。
(もちろん今回のCTPの参照設定は必要です。)
using System; namespace EF.PI.Walkthrough new RecreateDatabaseIfModelChanges
using (var context = new ProductCatalog()) // Create a new Food product var product = new Product {Name = productName, Category = food }; int recordsAffected = context.SaveChanges(); Console.WriteLine( // Query for all Food products using LINQ Console.WriteLine("All foods in database:"); Console.WriteLine("Press any key to exit.");
public class Category public ICollection
public class Product public Category Category { get; set; } public class Supplier
public class ProductCatalog : DbContext protected override void OnModelCreating(ModelBuilder modelBuilder) public DbSet |
これを実行して、適当にデータを入力します。
これでデータベースはどうなったのか?確認してみましょう。
こんな感じです。
あわわわ・・・
いつデータベースやテーブルが作られたの?
名前は?
スキーマは?
qあwせdrftgyふじこlp
と混乱するかもしれませんが、これがCoCならではの機能です。
実は以下の箇所がデータベース名を再設定しているところです。
public ProductCatalog()
: base("MyProductCatalog")
{ }
これがなければ、EF.PI.Walkthrough.ProductCatalogと言う名前になります。これが規約ですね。
ちなみに、Productテーブルのスキーマは以下にようになっています。
なぜ、ProductIdがキーなのだろうか・・・
これも規約です。(詳しくはこちらに書いてあります。)
じゃあ、規約に反してコードを修正すると、テーブルスキーマが変更になるのでしょうか?
Yesです。
以下のコードがあると、モデルの変更時にデータベースが再生成されます。
Database.SetInitializer
new RecreateDatabaseIfModelChanges
これをコメントアウトしてしまうと。。。(テーブルスキーマの変更が発生する類のコードの変更を行って・・・)ちょっとやってみました。
自分でデータベースを変更するか、SetInitializerしなさいとエラーになります。
=================
かつてJasperというテクノロジーがCTPであったのですが、その一部の精神がここに生きているように思えます。(あとはASP.NET DynamicData)懐かしいです・・・
こうしたCoC系のソリューションは大規模や厳密なものにはそぐわないかもしれませんが、上記にあるScott Guthrieブログに紹介された、MVCと組み合わせた軽量なWebサイトの構築などには、もってこいかもしれません。あぁそういえばMVCとコードファーストで、RoRもどきの完成ですね(笑)
Web Metrix、IIS Express、SQL Server Compact Edition、Razor、そして今回のEFのCodeFirstと、一連の発表からMSの方向性が見て取れそうですね。(PHP on Azureなんかもそうかもしれませんが・・・)
この辺はMS井上さんの記事が参考になります。
もっと Web 開発を簡単に ~ IIS Express と SQL Server Compact ~
もっと Web 開発を簡単に ~ ASP.NET の 新しい View Engine “Razor” ~
もっと Web 開発を簡単に ~ 復活!? WebMatrix ~
また、コードファーストのもう一つ、厳密なコードファーストは以下にあります。
EF Feature CTP4 Walkthrough: Code First
家族が起きてきたようなので、この辺で!(早朝でした)
tag : EntityFramework