Entity framework 我可以从指定的迁移中解码EntityFramework模型吗?
显然,IMiglationMetadata.Target对EF模型的状态进行编码。Entity framework 我可以从指定的迁移中解码EntityFramework模型吗?,entity-framework,entity-framework-5,Entity Framework,Entity Framework 5,显然,IMiglationMetadata.Target对EF模型的状态进行编码。 我可以用它来重建特定迁移的模型吗?是的,这是可能的。我自己也很好奇那些神奇的资源字符串到底在存储什么。通过(参见DbMigrator.GetLastModel()方法),我发现IMigrationMetadata.Target只存储一个包含gzip XML数据的base-64字符串。为了测试这一点,我创建了一个新的控制台应用程序,其中包含一个简单的代码优先模型,定义如下: public class Contact
我可以用它来重建特定迁移的模型吗?是的,这是可能的。我自己也很好奇那些神奇的资源字符串到底在存储什么。通过(参见
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; }
}
接下来,我将以下代码添加到应用程序的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());
这表示与创建迁移的myDbContext
关联的实体数据模型。如果将此输出写入扩展名为.edmx
的文件,则可以使用Visual Studio打开它,并在实体设计器中查看它
然后,如果出于某种原因,我想重新生成生成模型的DbContext
和实体类,我只需要执行以下操作:
.edmx
文件添加到Visual Studio项目中Add->New Item
,添加相关的T4模板.tt
文件,将$edmxInputFile$
替换为我的.edmx
文件名.cs
文件希望这能回答你的问题!:-D我创建了一个小型控制台应用程序,用于从迁移历史表的Model列导出EDMX
您可以使用
/migration
参数选择特定的迁移,即:
EfMigrationModelDecoder.Cli.exe "<connectionString here>" /migration:Init
efmigrationmodeldecorder.Cli.exe”“/migration:Init
我创建了一个PowerShell脚本来提取从DB到edmx文件的最新迁移
您还可以使用SQL
SELECT CONVERT(xml, DECOMPRESS(Model)) FROM [dbo].[__MigrationHistory] WHERE MigrationId = 'NameOfMigration'
+1,我们希望避免自动运行迁移,而是在管理员调用迁移时运行迁移,因此我们需要能够根据当前迁移重建模型。您能详细说明一下吗?例如,您希望在何时何地重建模型?你想解决什么问题?酷。现在我只需要想一个实际的应用程序:DGreat stuff@luksan,谢谢!对于任何感兴趣的人,我已经创建了一个小要点,可以从目标哈希中提取EDMX并再次压缩它:。当我需要在不影响链的其余部分的情况下更改迁移时,我会使用此选项。我从变更迁移中提取EDMX,编辑XML并将其压缩回以获得新的目标。然后,我必须对更改后的每个迁移执行此操作。我在MSSQL 2008中尝试了此操作,但无效。警告“解压缩”不存在。您使用哪个版本的sqlserver?sqlserver 2016及更高版本。对不起…我只是好久没看到SQL 2008服务器了。
SELECT CONVERT(xml, DECOMPRESS(Model)) FROM [dbo].[__MigrationHistory] WHERE MigrationId = 'NameOfMigration'