避免Ecore遏制关系中的重复

时间:2014-03-21 19:19:15

标签: emf ocl ecore

我有一个Ecore元模型。节点对等具有包含关系0 .. *在"中称为" 节点消息。我希望Peer包含的所有消息都有不同的名称。因此,对等方不能有两条同名的消息。

  +--------+                  +-----------+
  |  PEER  |◄►-- in 0..* -->  |  MESSAGE  |
  +--------+                  +-----------+
                              |name:String|
                              +-----------+
  • 我将属性 Message.name
  • 的选项 id = true
  • 我把选项 EKeys = name 放在关系 Peer.in
  • 尝试覆盖Message的方法 hashCode() equals(),根据属性 name

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

实际上我正在使用ATL作为M2M,结果是Peer有很多相同的消息。我希望约束在元模型中是隐含的,如果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>

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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