Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/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
C# 实体框架迁移和产品版本控制_C#_Entity Framework_Entity Framework 6 - Fatal编程技术网

C# 实体框架迁移和产品版本控制

C# 实体框架迁移和产品版本控制,c#,entity-framework,entity-framework-6,C#,Entity Framework,Entity Framework 6,场景: 我将EF6与我们的一个软件产品(基于网络的web应用程序)一起使用,我们在客户机器上安装了不同版本的产品。所有客户都有x个月的支持期,因此他们在不同版本的产品上运行,并且他们各自的数据库在不同的EF迁移上运行 我有几个其他同事帮助我提供产品支持,他们定期处理客户关于不同版本产品的支持电话 问题: 产品仅支持升级EF数据库,由于数据丢失问题,不支持降级。因此,当我们需要支持旧版本时,我们使用一个内部工具来升级/降级EF数据库。问题是我的同事不知道哪个数据库迁移与我们产品的哪个版本相匹配 所

场景:

我将EF6与我们的一个软件产品(基于网络的web应用程序)一起使用,我们在客户机器上安装了不同版本的产品。所有客户都有x个月的支持期,因此他们在不同版本的产品上运行,并且他们各自的数据库在不同的EF迁移上运行

我有几个其他同事帮助我提供产品支持,他们定期处理客户关于不同版本产品的支持电话

问题:

产品仅支持升级EF数据库,由于数据丢失问题,不支持降级。因此,当我们需要支持旧版本时,我们使用一个内部工具来升级/降级EF数据库。问题是我的同事不知道哪个数据库迁移与我们产品的哪个版本相匹配

所以我的问题是:有没有办法将我们的产品版本附加到迁移历史记录行

到目前为止,我考虑的是:

  • 在迁移的名称中嵌入产品版本

    这是可行的,但我需要培训其他开发人员,以确保在迁移中包括产品版本

  • 为产品的每个主要版本创建一个空迁移

    这个问题与方法1相同。我可以将其自动化到产品发布脚本中,但这涉及到太多的工作,更不用说可能的问题了

  • 我想要什么:

    我计划将产品版本附加到迁移本身。也就是说,我想在
    MigrationHistory
    表中添加一个新列,该列将保存此信息(将从
    HistoryRow
    派生我的新类)

    我不确定的是,如何截取数据库迁移模板,以便我可以将产品版本(汇编版本)嵌入到迁移中,而不必记住手动执行

    我相信你们中一定有人感到了这种痛苦,也许有更好的解决办法。有什么想法/建议吗?

    您可以通过实现和注册的自定义子类。然后您就拥有了普通DbContext的所有拦截方法:SaveChanges、ValidateEntity等

    但我不认为这真的有帮助。您实际上并不关心何时应用迁移,HistoryContext将告诉您这一点。您关心迁移是何时相对于您的发布创建的

    事实上,在你的资料中没有任何东西能告诉你这一点。你不知道当你做出改变时,最终会出现什么样的版本


    我认为你的想法“为产品的每个主要版本创建一个空迁移”是正确的。在该空迁移中,您可以添加代码来更新存储版本名称的某些表。

    不是100%清楚,但如果您的问题是需要从多个旧版本升级到当前版本,EF将处理该问题。生成所有迁移的幂等脚本,检查u MIgrationHistory以查看哪些迁移尚未应用。我的问题是降级。我不想截取迁移创建过程,以便在创建迁移时可以为自定义列嵌入值。