Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 我可以从指定的迁移中解码EntityFramework模型吗?_Entity Framework_Entity Framework 5 - Fatal编程技术网

Entity framework 我可以从指定的迁移中解码EntityFramework模型吗?

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

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

是的,这是可能的。我自己也很好奇那些神奇的资源字符串到底在存储什么。通过(参见
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());
这表示与创建迁移的my
DbContext
关联的实体数据模型。如果将此输出写入扩展名为
.edmx
的文件,则可以使用Visual Studio打开它,并在实体设计器中查看它

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

  • .edmx
    文件添加到Visual Studio项目中
  • 如果我还没有安装,请安装
  • 通过从项目节点上下文菜单中选择
    Add->New Item
    ,添加相关的T4模板
  • 修改新添加的
    .tt
    文件,将
    $edmxInputFile$
    替换为我的
    .edmx
    文件名
  • 看着这两个模板神奇地将my code first类型重新生成为各自的
    .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'