EF Code-Firstデータ移行の試み

2328 ワード

Code-First方式は大量のsqlコードを省いたが,移行の操作を増やした.次のようにします.
 
1、まず「拡張マネージャ」でNuGet「ライブラリパッケージマネージャ」を検索してインストールします.そうしないと、すべてのコマンドが認識されず、CommandNotFoundなどのエラーが表示されます.オフラインの場合は、NuGet.Tools.vsixをダウンロードしてインストールします.これにより、ツール->ライブラリパッケージマネージャ->ソリューションを管理するNuGetパッケージにインストールされているEFコンポーネントが自動的に見つかります.
 
2、DALプロジェクトにEFをインストールし、オンライン時にnugetで直接デフォルトプロジェクトを選択し、install-package EntityFrameworkを入力する.オフラインではEFのパッケージを手動でダウンロードする必要があり、解凍後nugetでローカルのソースディレクトリを選択:install-package EntityFramework-ImoreDependences-Source c:softwarepackages、このDALプロジェクトにはEF対応の参照が追加され、プロジェクトのpackages.configファイルにEFの情報が追加されています
 
3、このプロジェクトの移行を開始します.Enable-Migrationsを入力すると、プロジェクトに新しいMigrationsフォルダが作成され、Configuration.csとInitialCreateのリストアポイントが含まれます(これはsqlServer向けで、MySqlの場合はAdd-Migrationが自分で手作業で生成する必要があります).Migrationフォルダが既に存在する場合は、削除して再enable-migrationsしても、自動的にDBとテーブルが新規作成されます.DBとModelが完全に一致していることを確認する必要があります.起動時にEFは実体図に基づいてHash値を生成し、DBに_MigrationHistoryのデータを比較すると、一致しないとエラーが表示されます.
 
4、今DBができたので、勝手にモデルを直して、例えばUserにSex属性を追加して、次はどうやって移行しますか?2つの方法:1)自動更新AutomaticMigrationsEnabled=trueをオンにします.2)もちろん生産環境ではそうはいかないが,ユーザデータが最も重要であり,ここではAdd-Migration test 1である.sqlserverではOKですが、mysqlでは次のように報告されます.
No MigrationSqlGenerator found for provider"MySql.Data.MySqlClient".Use SetSqlGenerator method in the target migrations configuration class to register additional SQL generators.はっきり言って、コンフィギュレーション()に対応するsql generatorを足すといいです.
this.SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.Entity.MySqlMigrationSqlGenerator());

add-migration test 1を再実行し、移行コードを生成します.
 
5、update-databaseを実行し、modelの変化がDBに反映される.MigrationHistoryにもレコードが追加されています.外部公開の場合は、対応するsqlスクリプト:update-database-script-sourceMigration:$InitialDatabase-TargetMigration:test 3-startUpProjectName DAL.EFを生成します.
 
6、EFがオンラインになる時よくThe model backing the context has changed since the database was created.Consider using Code First Migrations to update the database.
この問題が発生した場合、まずDB接続文字列が正しいことを確認し、テスト版DBと正式版DBをそれぞれsqlにエクスポートし、UltraCompareで比較して、すべての列と属性が一致することを保証します.モデルが一致し、_MigrationHistoryのデータマッチングは、この問題を回避できるはずです.