0

我有一个 Ecore 元模型。节点Peer与节点Message有一个称为“ in ”的包含关系 0..* 。我希望 Peer 包含的所有消息都有不同的名称。所以一个 Peer 不能有两个同名的消息。

  +--------+                  +-----------+
  |  PEER  |◄►-- in 0..* -->  |  MESSAGE  |
  +--------+                  +-----------+
                              |name:String|
                              +-----------+
  • 我把属性Message.name的选项id=true
  • 我把选项EKeys=name的关系Peer.in
  • 试图覆盖Message 的hashCode()equals()方法,根据属性名称计算它们

但是在一个模型中,Peer 在它的关系仍然可以有相同的消息。我想也许 OCL 可以帮助我实现我想要的。

实际上,我将 ATL 用于 M2M,结果是 Peer 有许多相同的消息。我希望该约束隐含在元模型中,而无需在 ATL 规则中手动控制是否对等方在添加之前已经或没有该消息。

谢谢

节点对等

<eClassifiers xsi:type="ecore:EClass" name="Peer">
    <eStructuralFeatures xsi:type="ecore:EReference" name="in" upperBound="-1" 
     eType="#//Message"
     containment="true" eKeys="#//Message/name"
    />
</eClassifiers>

节点消息

<eClassifiers xsi:type="ecore:EClass" name="Message" abstract="true">
    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" 
     eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
     iD="true"
    />
</eClassifiers>
4

2 回答 2

0

OCL 约束确实会阻止这种情况(或者,更好地说,您可以通过在执行结束时评估此 OCL 约束来检查 ATL 转换是否产生了不一致的模型)

于 2014-03-23T13:52:04.337 回答
0

ID=true应使验证产生错误,并显示以下消息:The ID '...' of '...' collides with that of '...'

要验证您的模型,请使用例如:Diagnostician.INSTANCE.validate(eObjectToValidate)

于 2015-03-24T16:00:18.737 回答