假设我有这个简单的模型(Xcore语法):
class A {
contains B[] bs opposite a
}
class B {
String foo
container A a opposite bs
}
我现在有三个A,创建如下:
A a1 = ModelFactory.eINSTANCE.createA();
B b1 = ModelFactory.eINSTANCE.createB();
b1.setFoo("foo");
b1.setA(a1);
A a2 = ModelFactory.eINSTANCE.createA();
B b2 = ModelFactory.eINSTANCE.createB();
b2.setFoo("bar");
b2.setA(a2);
A a3 = ModelFactory.eINSTANCE.createA();
B b3 = ModelFactory.eINSTANCE.createB();
b3.setFoo("bar");
b3.setA(a3);
当我尝试比较它们时:
DefaultComparisonScope scope = new DefaultComparisonScope(a1, a2, a3);
Comparison comp = EMFCompare.builder().build().compare(scope);
EList<Diff> diffs = comp.getDifferences();
我希望在B__FOO
EAttribute上获得一个属性更改,但我为A__BS
的ADD类型获得了两个伪冲突。我认为这是因为EMF如何处理平等,而A和B在技术上是不同的。
我如何实现我得到“正确”的差异?
我在一个新的工作区中重新创建了这个例子,但我在A和B类型中添加了一个UUID(正如我的“真实”模型也有),这可以按预期工作。现在,找出为什么我的“真实”模型不...
答案 0 :(得分:0)
这里的问题是EMF Compare无法正确匹配元素,正如您通过添加UUID实现的那样。
在我看来,EMF Compare应该能够匹配您的B
元素,因为它们内部有一些区别和匹配,但A
相反,不是SCollection
自己掌握任何信息。向元素添加UUID会强制其身份,并允许EMF比较以了解谁是谁。
您可以通过添加自己的逻辑来匹配您的元素来规避问题。我假设这不是你的实际模型(和元模型)的样子,所以你可能有办法更好地区分你的元素(或者更好,以确保你的模型有标识符)。匹配逻辑可以以多种方式重新定义。一个是change the ID function(负责计算元素ID),如果你的案例包含一种方法来唯一地识别你的元素不是通过id属性或更改equality helper,这样你就可以准确地告诉EMF比较如何匹配您的对象(文档中没有示例代码,但您可以在ID function代码段上看到如何更改&#34;平等帮助工具&#34; )。