どうやら IMigrationMetadata.Target は EF モデルの状態をエンコードします。これを使用して、特定の移行のモデルを再構築できますか?
4 に答える
はい、可能です。私自身、それらの魔法のリソース文字列が正確に何を格納しているのか興味がありました. Entity Framework ソース(メソッドを参照)を掘り下げると、 gzip 圧縮された XML データを含む base-64 文字列が格納されているだけDbMigrator.GetLastModel()
であることがわかりました。IMigrationMetadata.Target
これをテストするために、次のように定義された単純なコード ファースト モデルを含む新しいコンソール アプリケーションを作成しました。
public class ContactContext : DbContext
{
public virtual IDbSet<Contact> Contacts { get; set; }
}
public class Contact
{
public int Id {get; set;}
public string FirstName { get; set; }
public string LastName { get; set; }
}
次に、NuGet パッケージ マネージャー コンソールを使用して移行を作成しました。
PM> Enable-Migrations
PM> Add-Migration MyMigration
次に、次のコードをアプリケーションのMain()
メソッドに追加して、その文字列の値をデコードし、コンソールにダンプしました。
var migration = new MyMigration();
var metadata = (IMigrationMetadata)migration;
var compressedBytes = Convert.FromBase64String(metadata.Target);
var memoryStream = new MemoryStream(compressedBytes);
var gzip = new GZipStream(memoryStream, CompressionMode.Decompress);
var reader = new StreamReader(gzip);
Console.WriteLine(reader.ReadToEnd());
これにより、移行を作成したmy に関連付けられたエンティティ データ モデルを表すEDMX ファイルが出力されます。DbContext
この出力を拡張子の付いたファイルに書き込むと.edmx
、Visual Studio で開いてエンティティ デザイナーで表示できます。
その後、何らかの理由でDbContext
、モデルを作成した および エンティティ クラスを再生成したい場合は、次の手順を実行するだけで済みます。
.edmx
ファイルを Visual Studio プロジェクトに追加します。- まだ持っていない場合は、C# 用の EF 5.x DbContext Generator をインストールします。
Add -> New Item
プロジェクト ノードのコンテキスト メニューから選択して、関連する T4 テンプレートを追加します。- 新しく追加されたファイルを変更し、自分のファイルの名前に
.tt
置き換えます。$edmxInputFile$
.edmx
- 2 つのテンプレートが魔法のようにコード ファースト型をそれぞれの
.cs
ファイルに再生成する様子をご覧ください。
それがあなたの質問に答えることを願っています! :-D
__MigrationHistory テーブルのモデル列から EDMX をエクスポートする小さなコンソール アプリを作成しましたhttps://github.com/andreydil/EfMigrationModelDecoderパラメータ
を使用して特定の移行を選択できます。/migration
EfMigrationModelDecoder.Cli.exe "<connectionString here>" /migration:Init