实体框架合并噩梦(Entity Framework Merge Nightmare)

2019-07-18 06:28发布

我们采用了实体框架和我们发现,当多人使他们的个人源控制分支孤立的变化,也有巨大的冲突,当他们走到一起,合并,导致破碎模型文件。

我们倚在强迫的文件的独占检出的方向,但我想避免这种情况。

我的问题是...

有没有更好的比较工具,它会处理这更好的,或者是有我们可以采取另一种方法?

寻找的东西,如果有可能被证明。

新的更新:对于那些你遇到了这个问题,它是基于旧EF。 我建议迁移到使用的DbContext在EDMX。 有大量的信息在这里SO一下吧。 数据库的第一或代码第一远远超过了设计师在我看来损失的简单性。

UPDATE:我们通过强制的文件的独占变化解决了这个问题。 通过增加这个过程中,我们完全消除任何问题。 虽然这不是理想的解决方案,这是最可靠和最容易实现。

Answer 1:

克雷格斯顿茨做了解释,这是设计师相关的XML(设计表面上的实体和协会等的位置),导致这里的大部分问题的一个好工作。 在内部冲突解决edmx:Runtime然而,元素是很实现的。

用于处理在设计相关的XML冲突的最佳策略是通过牺牲任何自定义布局,并恢复到默认布局完全绕过它们。

关键是要除去所有的内容的<Diagrams>元素。 设计师将没有任何问题打开并应用默认布局。

下面是一个EDMX文件将使用默认布局打开的一个例子。 需要注意的是的含量<edmx:Runtime>元件也不过除去这仅是为brevities起见-它不是解决方案的一部分。

<?xml version="1.0" encoding="utf-8"?>
<edmx:Edmx Version="2.0" xmlns:edmx="http://schemas.microsoft.com/ado/2008/10/edmx">
  <!-- EF Runtime content -->
  <edmx:Runtime>
  <!-- Removed for brevity's sake only!-->
  </edmx:Runtime>
  <!-- EF Designer content (DO NOT EDIT MANUALLY BELOW HERE) -->
  <Designer xmlns="http://schemas.microsoft.com/ado/2008/10/edmx">
    <Connection>
      <DesignerInfoPropertySet>
        <DesignerProperty Name="MetadataArtifactProcessing" Value="EmbedInOutputAssembly" />
      </DesignerInfoPropertySet>
    </Connection>
    <Options>
      <DesignerInfoPropertySet>
        <DesignerProperty Name="ValidateOnBuild" Value="true" />
        <DesignerProperty Name="EnablePluralization" Value="True" />
        <DesignerProperty Name="IncludeForeignKeysInModel" Value="True" />
      </DesignerInfoPropertySet>
    </Options>
    <!-- Diagram content (shape and connector positions) -->
    <Diagrams>
    </Diagrams>
  </Designer>
</edmx:Edmx>

请注意,在这里应用的默认布局不匹配,当你选择产生了一个Diagram | Layout Diagram Diagram | Layout Diagram从设计师的上下文菜单这是我本来期望。

更新:由于实体框架5 ,这变得容易一点。 在多图支持添加相关的XML到单独的文件中有图卸载。 请注意,我仍然在经历了许多实体框架升级的EDMX文件中的一些旧图相关的标记。 只是删除从EDMX文件名为图(包括儿童)的标签。



Answer 2:

有一些与大型实体框架模型在这篇文章中处理策略 。 你可以考虑使用他们。 然而,我发现,大多数与EDMX再生的痛苦来自于通过拖放的GUI设计所做的更改。 在另一方面,在做更新型号从数据库或通过属性窗口往往使在一个相当合理的方式变化,并且不倾向于难以合并。

最大的问题,据我所看到的,是在概念上/映射/存储模型的视觉对象模型的布局信息都在同一个文件。 换句话说,这个问题是不是文件本身或实体模型本身所做的改动这么大的规模,但是当你拖动并在GUI设计器中拖动一个对象,它发生在批发重排。 我希望GUI设计布局和概念/映射/存储型号分别放到不同的文件。 我相信,这将消除大多数的痛苦与合并更改模型。

因此,我们还没有做出改变模型的图形布局的一个半官方的政策。 这是没有太大的损失,因为当你有比在模型中几十个实体越多,单页只GUI设计是不是真的有用呢。 而且它肯定使合并容易得多。

实体框架的4版本将有一个选项来执行基于T4模板工件生成。 我不是专家,但有可能哄GUI布局信息为使用T4模板不同的文件。



Answer 3:

正如你所说,一个选择是锁定的文件。

另一种可能的选择是借道对球队一个人的所有模式的转变。

另一种选择是将文件分裂成更小的文件(如每类中的一个),有可能留下的过程中的一些设计师的支持。

另一种选择是创建自己的过程中,可能使用XSLT把EDMX文件,但我不知道这会看起来完全像什么,该designer.cs文件是巨大的难以合并之一。

另一种选择是要考虑不同的ORM。

我不知道,如果他们做任何事情在EF的下一个版本,以改善这一点。 扔在一个文件中的数据量并不意味着任何形式的可扩展性(但LinqToSql做同样的事 - 在这种情况下达明卫队创造了一些T4模板打破文件之外,不知道是否存在EF类似的东西)。



Answer 4:

其实,我试图说服我的公司去代码首先因为这个原因,而被关闭,很遗憾。 他们喜欢的是可以使用设计。 不幸的是,我跑在我们过去的生产问题部署在那里我们的WCF服务之一,它拥有约10端点支持多个用户,并在合并的过程中,有几个重复的条目在EDMX文件的CS区间。

在我的个人项目,我使用的代码第一次完全。 对我来说,这是同样的原因,我喜欢手动在自动变速器。 当然,模型设计可能更容易(有时,正如我们已经讨论过),但与代码首先,你这是怎么回事的更直接的控制。 就像一个手动变速器。 :)



Answer 5:

我不是超级熟悉EF特别,但我有我的超冗长和脆弱自动生成的代码问题的公平份额。 在每一种情况下,如何合并它的最好的答案是“不”。 在您的情况这可能意味着两种情况之一:

1)拧紧你的代码的推广模式,使EF代码只在一个方向流动。 换句话说,每一个冲突将得到解决,作为(AcceptTheirs)或“保持目标不变”(AcceptYours)“从源分支复制”,每个人都应该知道哪个是哪个提前。 最常见的,你会向分支树的节点稳定和促进AcceptYours新测试代码时,合并修复时回不稳定/开发分支要AcceptTheirs。 (如果有> 1的开发分支,然后你要分割的东西,这样的球队在一个给定的分支工作只拥有EF代码如下后者的规则。凡是他们不是有意改变应该由其他团队的代码覆盖从集成分支流动,必要时使用AcceptTheirs。)

                 /  -  [...]                 /  -  V1.1            /- 发布 
+集成 - DEV1 - DEV2 - [...]

“ 向下合并,复制了 ”

2)从字面上看不合并它们; 从完全的过程中排除EF代码。 当集成分支需要对数据库的更改和/或ORM,直接从数据库重新生成代理类。 (解析+建筑任何冲突更改您的SQL文件,当然后)至尊版:每天自动生成过程中做到这一点,合并不只是当。



文章来源: Entity Framework Merge Nightmare