Tim*_*ith 16 entity-framework entity-framework-5
显然,IMigrationMetadata.Target对EF模型的状态进行编码.我可以使用它来重建特定迁移的模型吗?
luk*_*san 28
对的,这是可能的.我很好奇这些神奇的资源字符串究竟存储了什么.通过深入了解Entity Framework源代码(参见DbMigrator.GetLastModel()
方法),我发现IMigrationMetadata.Target
只存储一个包含gzip压缩XML数据的base-64字符串.为了测试这个,我创建了一个新的控制台应用程序,其中包含一个简单的代码优先模型
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; }
}
Run Code Online (Sandbox Code Playgroud)
然后我使用NuGet包管理器控制台创建了一个迁移:
PM> Enable-Migrations
PM> Add-Migration MyMigration
Run Code Online (Sandbox Code Playgroud)
接下来,我将以下代码添加到我的应用程序的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());
Run Code Online (Sandbox Code Playgroud)
这将输出一个EDMX文件,表示与我DbContext
创建迁移的实体数据模型.如果我将此输出写入带.edmx
扩展名的文件,我可以使用Visual Studio打开它并在实体设计器中查看它.
然后,如果由于某种原因我想重新生成DbContext
生成模型的实体类,我只需要执行以下操作:
.edmx
文件添加到Visual Studio项目.Add -> New Item
从项目节点上下文菜单中选择添加相关的T4模板..tt
文件,替换$edmxInputFile$
为我的.edmx
文件名..cs
文件.希望这能回答你的问题!:-D
我创建了一个小型控制台应用程序,用于从__MigrationHistory表的Model列导出EDMX https://github.com/andreydil/EfMigrationModelDecoder
您可以使用/migration
参数选择特定的迁移,即:
EfMigrationModelDecoder.Cli.exe "<connectionString here>" /migration:Init
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3176 次 |
最近记录: |