takachaa / .net-Framework

0 stars 0 forks source link

【MVC】マイグレーションについて #13

Open takachaa opened 7 years ago

takachaa commented 7 years ago

EintityFrameworkのマイグレーションには大きく以下の種類がある

A.自動マイグレーション(Automatic Migration)

マイグレーションの実行時に自動的にモデルの変更を検知し、テーブルレイアウトを最新の状態に移行します。

B.コードベースマイグレーション(Coed-Based Migration)

パッケージマネージャーコンソールからコマンドを発行することで、任意のタイミングでマイグレーション(移行)を実施します。

http://blog.nakajix.jp/entry/2014/07/05/090000

takachaa commented 7 years ago

コードベースマイグレーション(Coed-Based Migration)

1.マイグレーションを利用するためまずマイグレーションの基本設定ファイル作成する

パッケージマネージャーコンソールにて以下コマンドを実行すると

PM>Enable-Migrations -ContextTypeName WebApplication3.Models.WebApplication3Context

マイグレーションの基本設定ファイル(Configuration.cs)が作成される

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

    internal sealed class Configuration : DbMigrationsConfiguration<WebApplication3.Models.WebApplication3Context>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = true;  //自動マイグレーションは「true」 
            ContextKey = "WebApplication3.Models.WebApplication3Context"; //完全修飾コンテキスト名
        }

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

            //  You can use the DbSet<T>.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" }
            //    );
            //
        }
    }
}

2.モデルのプロパティ構成を変更して実行すると以下のようなエラーメッセージがでる

データベースの作成後、コンテキストの背後にあるモデルが変更されました。
Code First Migrationを使用したデータベースの更新を検討してください。

3.パッケージマネージャーコンソールからAdd-Migrationコマンドを使ってモデルの変更を検出して必要なマイグレーションファイルを自動生成する。

PM>Add-Migration AddAddressToMembers

※AddAddressToMembersは意味が分かる名前にする(ファイル名に使われるので)

4.コマンド実行後以下のようなファイルが作成される

201709181254154_AddAddressToMembers.cs

namespace WebApplication4.Migrations
{
    using System;
    using System.Data.Entity.Migrations;

    public partial class AddAddressToMembers : DbMigration
    {
        public override void Up()
        {
            AddColumn("dbo.Members", "Address", c => c.String());
        }

        public override void Down()
        {
            DropColumn("dbo.Members", "Address");
        }
    }
}

前回のマイグレーションから以降に、エンティティに対して加えられた変更を自動的に認識して、コードを自動生成してくれる。

5.パッケージマネージャーコンソールからコマンドを使ってマイグレーションを実行する

PM>Update-Database -Verbose

6.テーブル構成がモデルのプロパティ構成変更をもとに再構成される

takachaa commented 7 years ago

自動マイグレーション(Automatic Migration)

1.モデルとコンテキストを用意する(スケャッフォールディング)

2.パッケージマネージャーコンソールから以下コマンドでマイグレーションの基本設定ファイル作成する

Enable-Migrations -EnableAutomaticMigrations

マイグレーションの基本設定ファイル(Configuration.cs)が作成される

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

    internal sealed class Configuration : DbMigrationsConfiguration<WebApplication5.Models.WebApplication5Context>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = true;
        }

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

            //  You can use the DbSet<T>.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" }
            //    );
            //
        }
    }
}

3.Global.csファイルのApplication_Startメソッドに以下を追記

Database.SetInitializer( new MigrateDatabaseToLatestVersion<WebApplication5Context, Configuration>());

4.これでアプリを実行すると、すでにテーブルに格納されているレコードを消してしまうことなどなく、列が自動で追加されてデータベース構造が更新され、アプリが稼働する

その他 プロパティやモデルクラスを削除したいときは

プロパティやモデルクラスを削除したいときは以下のように修正

public Configuration()
{
      AutomaticMigrationsEnabled = true;
      AutomaticMigrationDataLossAllowed = true;  //ここ
}

参考 http://devadjust.exblog.jp/21281742/