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 ジェネレーターを登録してください。
- 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
もう一箇所、マイグレーション履歴を保持する __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が実行可能となる。