ハロの外部記憶インターフェイス

そろそろ覚える努力が必要かも…

MySqlでのマイグレーション設定

Nugetパッケージ管理より、「MySql.Data.Entity」をインストールする。

mysqlで検索し、インストールを行う。
MySql.Data.Entity のインストール時に自動で追加されているので、connectionStrings のみ変更します。

web.config

  <connectionStrings>
    <add name="DefaultConnection" 
         connectionString="server=localhost;port=3306;database=dbname;uid=user1;password=pass1;charset=utf8" 
         providerName="MySql.Data.MySqlClient" />
  </connectionStrings>

enable-migrations

PM> enable-migrations
コンテキストが既存のデータベースを対象にしているかをチェックしています...
Code First Migrations がプロジェクト MySqlTest で有効になりました。

add-migration

PM> add-migration Initial
プロバイダー 'MySql.Data.MySqlClient' で MigrationSqlGenerator が見つかりませんでした。対象の移行構成クラスで SetSqlGenerator メソッドを使用して、追加の SQL ジェネレーターを登録してください。
  1. SetSqlGeneratorを設定しろとのエラーがなる

Migrationsの「Configuration.cs」を編集する。
コンストラクタに「SetSqlGenerator」メソッドを以下の様に追加。

   public Configuration()
   {
       AutomaticMigrationsEnabled = false;

       public class MysqlConfiguration : DbConfiguration
       {
           public MysqlConfiguration()
           {
               SetMigrationSqlGenerator(MySqlProviderInvariantName.ProviderName, () => new MySqlMigrationSqlGenerator());
           }
       }
   }

再度、初期化処理を実行

PM> add-migration Initial
移行 'Initial' をスキャフォールディングしています。
この移行ファイルのデザイン コードには、現在の Code First モデルのスナップショットが含まれています。このスナップショットは次の移行をスキャフォールディングする際、モデルに対する変更の計算に使用されます。モデルに追加の変更を行い、この移行に含める場合は、'Add-Migration Initial' を再実行して再度スキャフォールディングできます。

今度は問題なく初期化コードが作成された。

update-database

先ずは以下のエラーになる

Specified key was too long; max key length is 767 bytes
  1. 理由はInitial.csの中にMySQL ではキーの長さの上限が 255 (utf-8のvarchar型)のため、キーとなるカラムの長さを 256 から 255 に修正する必要がある。

もう一箇所、マイグレーション履歴を保持する __migrationhistory テーブルも修正する
先ほどの Configuration.cs に HistoryContext の継承クラスを作成してキーの長さを変更する。

Configuration.cs

namespace MySqlTest.Migrations
{
    using System;
    using System.Data.Common;
    using System.Data.Entity;
    using System.Data.Entity.Migrations;
    using System.Data.Entity.Migrations.History;
    using MySql.Data.Entity;

    internal sealed class Configuration : DbMigrationsConfiguration<MySqlTest.Models.ApplicationDbContext>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = false;
        }

        public class MysqlConfiguration : DbConfiguration
        {
            public MysqlConfiguration()
            {
                SetMigrationSqlGenerator(MySqlProviderInvariantName.ProviderName, () => new MySqlMigrationSqlGenerator());

                SetHistoryContext("MySql.Data.MySqlClient", (dbConnection, defaultSchema) => new MysqlHistoryContext(dbConnection, defaultSchema));
            }
            public class MysqlHistoryContext : HistoryContext
            {
                public MysqlHistoryContext(DbConnection dbConnection, string defaultSchema)
                    : base(dbConnection, defaultSchema)
                {
                }

                protected override void OnModelCreating(DbModelBuilder modelBuilder)
                {
                    base.OnModelCreating(modelBuilder);

                    modelBuilder.Entity<HistoryRow>().Property(h => h.MigrationId).HasMaxLength(255).IsRequired();
                    modelBuilder.Entity<HistoryRow>().Property(h => h.ContextKey).HasMaxLength(255).IsRequired();
                }
            }
        }
    }
}

これでようやくupdate-databaeが実行可能となる。

参考:http://qiita.com/midori44/items/ef7cdd1d37c353e44b5f