显然,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/