まだ生きているようです

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
-------- : スポンサー広告 :
Pagetop

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;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Data.Entity.ModelConfiguration;
using System.Linq;

namespace EF.PI.Walkthrough
{
    class Program
    {
        static void Main(string[] args)
        {
            Database.SetInitializer(

new RecreateDatabaseIfModelChanges());

           

using (var context = new ProductCatalog())
            {
                // Use Find to locate the Food category
                var food = context.Categories.Find("FOOD");
                if (food == null)
                {
                    food = new Category { CategoryId = "FOOD", Name = "Foods" };
                    context.Categories.Add(food);
                }

                // Create a new Food product
                Console.Write("Please enter a name for a new food: ");
                var productName = Console.ReadLine();

                var product = new Product {Name = productName,

                         Category = food };
                context.Products.Add(product);

                int recordsAffected = context.SaveChanges();

                Console.WriteLine(
                    "Saved {0} entities to the database.",
                    recordsAffected);

                // Query for all Food products using LINQ
                var allFoods = from p in context.Products
                                where p.CategoryId == "FOOD"
                                orderby p.Name
                                    select p;

                Console.WriteLine("All foods in database:");
                foreach (var item in allFoods)
                {
                    Console.WriteLine(" - {0}", item.Name);
                }

                Console.WriteLine("Press any key to exit.");
                Console.ReadKey();
            }
        }
    }

 

    public class Category
    {
        public string CategoryId { get; set; }
        public string Name { get; set; }

        public ICollection Products { get; set; }
    }

 

    public class Product
    {
        public int ProductId { get; set; }
        public string Name { get; set; }
        public string CategoryId { get; set; }

        public Category Category { get; set; }
    }

    public class Supplier
    {
        [Key]
        public string SupplierCode { get; set; }
        public string Name { get; set; }
    }

 

    public class ProductCatalog : DbContext
    {
        public ProductCatalog()
            : base("MyProductCatalog")
        { }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity().Property(s => s.Name).IsRequired();
        }

        public DbSet Categories { get; set; }
        public DbSet Products { get; set; }
        public DbSet Suppliers { get; set; }
    }
}

 

これを実行して、適当にデータを入力します。

20100718_EF1

これでデータベースはどうなったのか?確認してみましょう。

20100718_EF2

こんな感じです。

 

あわわわ・・・

いつデータベースやテーブルが作られたの?

名前は?

スキーマは?

qあwせdrftgyふじこlp

と混乱するかもしれませんが、これがCoCならではの機能です。

 

実は以下の箇所がデータベース名を再設定しているところです。

public ProductCatalog()
            : base("MyProductCatalog")
        { }

これがなければ、EF.PI.Walkthrough.ProductCatalogと言う名前になります。これが規約ですね。

ちなみに、Productテーブルのスキーマは以下にようになっています。

20100718_EF3

なぜ、ProductIdがキーなのだろうか・・・

これも規約です。(詳しくはこちらに書いてあります。)

 

じゃあ、規約に反してコードを修正すると、テーブルスキーマが変更になるのでしょうか?

Yesです。

 

以下のコードがあると、モデルの変更時にデータベースが再生成されます。

Database.SetInitializer(

new RecreateDatabaseIfModelChanges());

 

これをコメントアウトしてしまうと。。。(テーブルスキーマの変更が発生する類のコードの変更を行って・・・)ちょっとやってみました。

20100718_EF4

自分でデータベースを変更するか、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

2010-07-18 : EntityFramework : コメント : 0 : トラックバック : 1
Pagetop
MS社員は全員Windows Phone7 支給してもらえるそうで «  ホーム  » UQ Wimaxを導入してみました
trackback

この記事にトラックバックする(FC2ブログユーザー)
ADO.NET Entity Framework Code First を使ってみよう
ようやく来週から夏休み?を取得できます。まぁ、まだ真夏のように暑い日々が続いているのでオッケーでしょう(なにが?)   さて、今日はようやく時間が出来たので ADO.NET Entity Framework
2010-09-22 17:21 : 雲のごとく
Pagetop
コメントの投稿
非公開コメント

Pagetop
« next  ホーム  prev »

カレンダー

プルダウン 降順 昇順 年別

09月 | 2017年10月 | 11月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -


カテゴリ

openclose

タグクラウドとサーチ

メールフォーム

名前:
メール:
件名:
本文:

プロフィール

こだかたろう

元MSの小高と申します。
(↓こんな人です。)
こんな見た目です

ずっとエバンジェリストをしていましたが、この度転身いたしました。
よろしくどうぞ。

Select Template

RSSリンクの表示

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。