1

下面的跟进

假设我有这个简单的模型(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__FOOEAttribute 上获得一个属性更改,但是对于A__BS. 我认为这是因为 EMF 如何处理平等,而 A 和 B 在技术上是不同的。

我如何实现我得到“正确”的差异?

跟进 1

我在一个新的工作区中重新创建了这个示例,但是我向 A 和 B 类型添加了一个 UUID(就像我的“真实”模型一样),这可以按预期工作。现在要找出为什么我的“真实”模型不...

4

1 回答 1

0

这里的问题是 EMF 比较无法正确匹配元素,正如您通过添加 UUID 实现的那样。

正如我所看到的,EMF Compare 应该能够匹配您的B元素,因为它们内部有一些东西可以区分和匹配,但是A相反,它们自己不保存任何信息。向您的元素添加 UUID 会强制它们的身份,并允许 EMF 比较知道谁是谁。

您可以通过添加自己的逻辑来匹配您的元素来规避该问题。我认为这不是您的实际模型(和元模型)的样子,因此您可能有办法更好地区分您的元素(或者更好的是,确保您的模型具有标识符)。匹配逻辑可以通过多种方式重新定义。一种是更改 ID 函数(负责计算元素 id),如果您的案例包括一种方法来唯一标识您的元素,而不是通过 id 属性或更改相等帮助器,以便您可以告诉 EMF Compare 准确地匹配您的对象(文档中没有示例代码,但您可以在ID 函数片段中看到如何更改“平等帮助器工厂”)。

于 2017-06-19T08:05:43.753 回答