technoshop

杉並区和泉のソフトウェアハウス、株式会社テラソフトの技術ブログです。主に.NET MVCとKnockoutJSの情報をまとめます。

Entity Framework Code First でRailsっぽくDBを管理する

こんにちは。ザクです。出世したら、リンクの色を赤に変えます。

.Net MVC4になってだいぶRailsっぽいことができるようになっています。しかし、Entity FrameworkのCode Firstについての情報のなんと少ないこと。。。仕方がないので、自分で使い方を色々まとめてみます。

Code Firstってなんですか?

ぶっちゃけ、Microsoft的にはCode Firstをなんて定義してるのかザクは知りませんw 僕の理解は、Railsの「DB Migrations」なんかなーと。たしかに、DB Migrations後進の.Netの世界では、まだまだDBのスキーマSQLサーバ上でごりごり書いていたりしています。(いいかげん、プログラマーがDB直接触るのやめようよ。。。)

MVC4にはCode Firstがあるため、Railsプログラマーには割りとすんなり入り込めます。C#Javaっぽいですし。

Code Firstをマスターするには?

下のチュートリアルをやってみるのが一番早いです。(ただし英語です)


Getting Started with EF 5 using MVC 4 | The ASP.NET Site

MVC4アプリケーションを作ると、EF5がすでに入っているはずなので、パッケージマネージャのコンソール(何故かCode Firstのコマンドラインは、ここで操作する)から、enable-migrationsすればアプリケーションがCode First化されます。

Code First化するまえに先にモデルを用意する

見出しのまんまですね。Code FirstでSQLサーバに自動でDBスキーマを作るには、スキーマになるモデルを先に用意してやる必要があります。チュートリアル第1回を参考に、Student、Enrollment、Courseの3つのモデルをModelsフォルダの中に作ってやりましょう。Modelファイルの追加は、Modelsフォルダを右クリックして、追加を選びます。すると「新しい項目の追加」ダイアログが表示されるので、「クラス」を選び、名前をつけて追加ボタンを押します。

Creating an Entity Framework Data Model for an ASP.NET MVC Application (1 of 10) | The ASP.NET Site

コードの中身は、チュートリアルにあるものまんまコピペでいいでしょう。namespaceだけちゃんとアプリの名前に合わせてくださいね。

DALファイルを用意する

モデルだけでは、Code First化はまだできません。DALファイルと呼ばれるものを用意する必要があります。DALは「Data Access Layer」の略だそうです。このファイルを通じて、EF5がアプリ内のモデルを見つけてDBスキーマ管理してくれるようになります。

プロジェクト直下に、「DAL」というフォルダを追加してください。フォルダができたら、またクラスファイルを追加します。こちらも中身はチュートリアルのをまんまコピペでいいです。

チュートリアルでは、Web.configのconnectionStringが設定されている部分のnameを書き換えて、SchoolContextとしていましたが、DefaultConnectionのまま使いたい場合は、DALファイルに以下のようなコンストラクタを追加してやります。

using MvcApplication1.Models;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;

namespace MvcApplication1.DAL
{
  public class SchoolContext : DbContext
  {
    public SchoolContext()
      : base("DefaultConnection")
    {
    }
    public DbSet<Student> Students { get; set; }
    public DbSet<Enrollment> Enrollments { get; set; }
    public DbSet<Course> Courses { get; set; }
  }
}

チュートリアルのコードサンプルでは、

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
  modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}

という行が追加されていたと思いますが、これはモデルの命名規則の規約を乗っ取る方法なので、規約のまま利用したい場合は、この部分は削除します。僕はRailsで慣れているので、規約のまま使っています。

enable-migrationsしてみる

やっとenable-migrationsできるようになりました。チュートリアル通りにパッケージマネージャのコンソールからコマンドを実行しましょう。

enable-migrations -contexttypename SchoolContext

「Code First Migrations がプロジェクト <アプリ名>で有効になりました。」とメッセージが表示されたら無事Code First化が完了しています。同時にMigrationsというフォルダがプロジェクトに追加され、中にはConfiguration.csが入っています。

Configuration.csにシードデータを用意する

スキーマだけできても、中にデータが入っていないとアプリ開発では役に立ちません。Code Firstで自動生成されるテーブルに入れるデータを用意しましょう。データはConfiguration.csに書きます。サンプルデータはチュートリアルのをコピペでいいでしょう。

いざCode First!

ここまできたら、Code Firstの準備は整いました。以下のコマンドをコンソールから実行してみましょう。

add-migration InitialCreate
update-database

上のコマンドはRailsでいう「rails generate migration」です。下が「rake db:migrate」ですね。上のコマンドで、migrationファイルが生成されるので、update-databaseで実行です。

テーブルができたかの確認には、VSだったらサーバーエクスプローラーが便利ですね。

f:id:technoshop:20140918162851j:plain

シードデータもちゃんと入っていますね!

f:id:technoshop:20140918163059j:plain

追伸 シンタックスハイライトって「はてな記法」の時しかできないのね。。しかも一度保存したら記法変えられない。。次からちゃんとやります。