18

どうやら IMigrationMetadata.Target は EF モデルの状態をエンコードします。これを使用して、特定の移行のモデルを再構築できますか?

4

4 に答える 4

31

はい、可能です。私自身、それらの魔法のリソース文字列が正確に何を格納しているのか興味がありました. 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、モデルを作成した および エンティティ クラスを再生成したい場合は、次の手順を実行するだけで済みます。

  1. .edmxファイルを Visual Studio プロジェクトに追加します。
  2. まだ持っていない場合は、C# 用の EF 5.x DbContext Generator をインストールします。
  3. Add -> New Itemプロジェクト ノードのコンテキスト メニューから選択して、関連する T4 テンプレートを追加します。
  4. 新しく追加されたファイルを変更し、自分のファイルの名前に.tt置き換えます。$edmxInputFile$.edmx
  5. 2 つのテンプレートが魔法のようにコード ファースト型をそれぞれの.csファイルに再生成する様子をご覧ください。

それがあなたの質問に答えることを願っています! :-D

于 2013-03-30T19:04:05.173 に答える
5

__MigrationHistory テーブルのモデル列から EDMX をエクスポートする小さなコンソール アプリを作成しましたhttps://github.com/andreydil/EfMigrationModelDecoderパラメータ
を使用して特定の移行を選択できます。/migration

EfMigrationModelDecoder.Cli.exe "<connectionString here>" /migration:Init
于 2015-06-10T11:25:30.337 に答える