[ASP.NET MVC]自動マイグレーション

NO IMAGE

ASP.NET MVC 5 開発メモ

このサイトは ASP.NET MVC 5 で開発したのでその際に勉強したことを、忘れないように書き残します。

小規模の開発なら自動マイグレーションがとても便利でした。

自動マイグレーション設定

マイグレーションはデータベース(テーブルレイアウト)を作成/変更するための仕組みです。データベースを削除し再度作成すれば必要ないのですが、開発中だと頻繁にモデルの更新が行われる可能性もあります。そのたびに既存のデータが削除されていしまうのも不便です。

そこでマイグレーションを使います。個人、趣味の開発だと自動マイグレーションを有効にしておくと、モデルの更新に合わせて勝手にデータベースを更新してくれるので便利です。使い方は下記の通り。

  1. パッケージマネージャーコンソールを使用し、次のコマンドを入力します。

    Enable-Migrations -EnableAutomaticMigrations

このコマンドでプロジェクトにマイグレーション用のファイルが自動生成され、準備完了です。しかしこのままではデータのロスを伴う変更(列の削除等)はできません。これも可能にするにはAutomaticMigrationDataLossAllowedプロパティを設定します。

Migrations/Configurations.cs

namespace WebApplication1.Migrations
{
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Migrations;
    using System.Linq;

    internal sealed class Configuration : DbMigrationsConfiguration
    {
        public Configuration()
        {
            // 自動マイグレーションの有効化
            AutomaticMigrationsEnabled = true;
            // データロスを伴う更新を許可
            AutomaticMigrationDataLossAllowed = true;
            ContextKey = "WebApplication1.Models.SampleContext";
        }

        protected override void Seed(WebApplication1.Models.SampleContext context)
        {
            //  This method will be called after migrating to the latest version.

            //  You can use the DbSet.AddOrUpdate() helper extension method
            //  to avoid creating duplicate seed data. E.g.
            //
            //    context.People.AddOrUpdate(
            //      p => p.FullName,
            //      new Person { FullName = "Andrew Peters" },
            //      new Person { FullName = "Brice Lambson" },
            //      new Person { FullName = "Rowan Miller" }
            //    );
            //
        }
    }
}
  1. 最後にGlobal.aspxにイニシャライザを設定し、最新のデータベースにデータごと移行するようにします。

Global.aspx

using System.Data.Entity;
using System.Web.Mvc;
using System.Web.Routing;
using WebApplication1.Migrations;
using WebApplication1.Models;

namespace WebApplication1
{
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            RouteConfig.RegisterRoutes(RouteTable.Routes);

            // 最新のデータベースにデータごと移行
            Database.SetInitializer(new MigrateDatabaseToLatestVersion());
        }
    }
}

MigrateDatabaseToLatestVersionクラスはデータベースを最新バージョンに移行し、データも最新の状態に移行(既存のデータを引き継ぎ)を可能にします。引数には利用するコンテキスト、マイグレーションを指定します。

これで自動マイグレーションの設定が完了です。アプリケーション起動時にイニシャライザが起動し、常に最新のデータベースがデータを損なわず使用できます。ただし、モデルを削除したりすると、当然当該テーブルが削除されるので、チームでの開発では注意が必要かもしれません。

ASP.NET MVCカテゴリの最新記事