显然,IMigrationMetadata.Target对EF模型的状态进行编码。 我可以使用它来重建特定迁移的模型吗?我可以从指定的迁移中解码EntityFramework模型吗?
15
A
回答
24
是的,这是可能的。我很好奇这些神奇的资源字符串正在存储什么。通过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打开它并在Entity Designer中查看它。
然后,如果由于某种原因,我想重新产生该模型DbContext
和实体类,我只需要做到以下几点:
- 的
.edmx
文件添加到Visual Studio项目。 - 如果我还没有安装EF 5.x DbContext Generator for C#。
- 通过从项目节点上下文菜单中选择
Add -> New Item
来添加相关的T4模板。 - 修改新添加的
.tt
文件,用我的.edmx
文件的名称替换$edmxInputFile$
。 - 观看这两个模板神奇地将我的代码优先类型重新生成到它们各自的
.cs
文件。
希望能回答你的问题! :-D
5
我创建了一个小型控制台应用程序从__MigrationHistory表https://github.com/andreydil/EfMigrationModelDecoder
的模型列出口EDMX您可以选择特定迁移使用/migration
参数,即:
EfMigrationModelDecoder.Cli.exe "<connectionString here>" /migration:Init
1
我创建了一个PowerShell脚本从数据库提取最新的迁移到edmx文件。
https://gist.github.com/otto-gebb/93d021c8fd300646dba0073a77585a94
相关问题
- 1. EntityFramework迁移指定web.config
- 2. 我可以从模型代码中调用指定范围吗?
- 3. EntityFramework可以支持EAV模型吗?
- 4. C#我可以从EntityFramework扩展IdentityMessage吗?
- 5. 我可以删除迁移文件吗?
- 6. 我可以删除迁移文件吗?
- 7. 的EntityFramework代码优先迁移
- 8. Can Flyway可以从数据模型中找出并生成迁移文件吗?
- 9. 我可以指定Ember js模型上的商店吗?
- 10. 我可以从泛型类继承而不指定类型吗?
- 11. 合并模型可以使用轻量数据迁移吗?
- 12. 禁用EntityFrameWork迁移
- 13. 我可以从模型中获取绑定元素的id吗?
- 14. c#EntityFramework CodeFirst迁移为我的数据库模型中现有的一个
- 15. 我可以从DTS迁移到等效的MySQL工具吗?
- 16. 删除特定的EntityFramework迁移
- 17. TFS 2010,我可以只迁移源代码吗?
- 18. 我可以删除迁移目录中的django迁移文件吗
- 19. 指定迁移
- 20. 我可以为现有模型创建初始迁移
- 21. 我们可以从VSS - > TFS迁移PL/SQL文件吗?
- 22. 我可以从.sql创建初始CodeIgniter数据库迁移吗?
- 23. 我可以从PHP 5.3.10迁移到PHP 5.6.0吗?
- 24. 我可以无缝地从Firebase Auth迁移用户吗?
- 25. 从数据集迁移到EntityFramework
- 26. 如何阻止EntityFramework迁移自动创建我的模式?
- 27. 基于EntityFramework代码的迁移,如何确定订单?
- 28. 我可以为laravel中的模型方法指定不同的mysql连接吗?
- 29. 我可以在Xaml中指定DataGrid项目的类型吗?
- 30. 我可以在GtkListStore中存储未指定的类型吗?
+1,我们要避免自动,而是运行的迁移运行它们时,管理员调用它们,所以我们需要能够重建模型无论从任何当前的迁移。 –
能否详细说明一下?像你想在何时何地重建模型?你想解决什么问题? –