こんばんわ。目が痛いけど頑張ってブログを書きます、しばやんです。
今回は普通は使わないだろうけど、実際には普通に使えるんだよシリーズ第一弾(謎)として Entity Framework 4.1 を使ったコードファースト開発を行ってみます。
とりあえずは普通に WebMatrix で Web サイトを作って、パッケージマネージャから Entity Framework 4.1 をインストールするわけですが、最新版はパッケージのフォーマットが古いのでエラーになります。4.1.10331.0 を選んでインストールしてください。
Entity Framework の準備が出来たら、WebMatrix に戻って Web サイトに App_Code ディレクトリを追加します。
この名前のディレクトリは特殊で、実行時に中にあるファイルがコンパイルされるようになっているのですが、今までヘルパーを作った時には cshtml だけ入れてきました。しかし、拡張子 cs ファイルを入れておいてもコンパイルしてくれるので、今回はこれを利用してコードファースト開発を行います。
それでは App_Code ディレクトリに DbContext を継承したクラスとエンティティクラスを追加していきます。ディレクトリを右クリックして新規作成を選択すると、ポップアップが表示されて作成するファイルの種類が選べます。そのままでは cs ファイルは出てきませんが、サイドバーから推奨を選択すると Class (C#) という名前で cs ファイルが出てきます。
ファイル名を適当に付けて「OK」をクリックするとクラスが作られますが、Visual Studio のようにクラス名を自動で付けてくれないので手動で付けます。今回はとりあえず ProductContext と Product という名前にしました。
public class ProductContext : DbContext { public DbSet<Product> Products { get; set; } }
public class Product { public int Id { get; set; } public string Name { get; set; } public decimal Price { get; set; } }
まあ、非常に簡単なコンテキストとエンティティです。ついでなので _AppStart.cshtml に普段は Global.asax で書くコードを追加しておきましょう。
@using EF = System.Data.Entity; @{ EF.Database.SetInitializer(new EF.DropCreateDatabaseIfModelChanges<ProductContext>()); }
これでテーブルが自動的に生成されるようになりました。ちなみに using で別名を割り当ててる理由は Database というクラス名が WebMatrix 標準のクラスと衝突するからです。
これで DbContext API を使う上で必要なコードは準備できましたが、まだ接続文字列を定義していなかったので Web.config を追加します。これはルートディレクトリを右クリックで追加してください。
作成された Web.config はほぼ空っぽの状態なので、接続文字列を定義する上で必要な要素ごと追加します。名前はデフォルトで DbContext を継承したクラス名になります。
あと、このままだと Entity Framework が内部で使っているクラスを持っているアセンブリへの参照が足りないと怒られるので、一緒に定義してあげます。アセンブリ名は System.Data.Entity です。
<?xml version="1.0"?> <configuration> <connectionStrings> <add name="ProductContext" connectionString="Data Source=|DataDirectory|Product.sdf" providerName="System.Data.SqlServerCe.4.0" /> </connectionStrings> <system.web> <compilation debug="false" targetFramework="4.0"> <assemblies> <add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> </assemblies> </compilation> </system.web> </configuration>
これで全ての準備は完了したので、実際に ProductContext クラスを使ってデータを格納してみたいと思います。Default.cshtml にデータを全件出力して、さらに格納するコードを追加しました。
@{ var context = new ProductContext(); // 全件出力する foreach (var product in context.Products) { <text>ID:@product.Id 商品名: @product.Name 値段:@product.Price</text><br /> } // データを追加 context.Products.Add(new Product { Name = "商品", Price = 1980 }); context.SaveChanges(); }
実行するとリロードの度に表示される件数が増えるので、データベースに格納されていることが分かります。
今回、わざわざ WebMatrix で Entity Framework 4.1 を使ってみましたが、普段は WebMatrix 内蔵の機能を使いながら、多対多など複雑なエンティティが必要な場合だけ Entity Framework を使えば楽できそうですね。