entity-framework - 我可以从特定的迁移中解码 Entity Framework 模型吗?

标签 entity-framework entity-framework-5

显然,IMigrationMetadata.Target对EF模型的状态进行编码。
我可以使用它来为特定迁移重建模型吗?

最佳答案

是的,有可能。我自己很好奇那些魔术资源字符串到底存储了什么。通过digging into the Entity Framework source(请参阅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; }
}


然后,我使用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());


outputs an EDMX file 表示与创建迁移的我的DbContext关联的实体数据模型。如果我将此输出写入扩展名为.edmx的文件中,则可以使用Visual Studio打开它并在实体设计器中查看它。

然后,如果由于某种原因我想重新生成生成模型的DbContext和实体类,则只需执行以下操作:


.edmx文件添加到Visual Studio项目。
如果尚未安装EF 5.x DbContext Generator for C#,请安装它。
通过从项目节点上下文菜单中选择Add -> New Item,添加相关的T4模板。
修改新添加的.tt文件,将$edmxInputFile$替换为我的.edmx文件的名称。
看着这两个模板神奇地将我的代码优先类型重新生成为各自的.cs文件。


希望这能回答你的问题! :-D

关于entity-framework - 我可以从特定的迁移中解码 Entity Framework 模型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15709849/

相关文章:

c# - 领域驱动设计和 Entity Framework 4.1(代码优先)

c# - EF Code First 多个父项的单个外键

ef-code-first - 如何创建和使用通用类 EntityTypeConfiguration<TEntity>

c# - Entity Framework 中的排序列属性

entity-framework - Azure 移动应用-使用外键 "Bad Request"400 错误发布到表

.net - System.Data.Entity.ModelConfiguration.Mappers.TypeMapper 在哪个程序集中定义?

c# - 具有多个 OR 条件的 Linq to Entity Join 表

generics - Entity Framework 在T4上实现通用接口(interface)

entity-framework-5 - EF5 迁移种子 AddOrUpdate 具有可为空的选择标准

dependency-injection - ActionFilterAttribute ninject 注入(inject) - DbContext 已被释放