我有一个Ecore元模型。节点对等具有包含关系0 .. *在"中称为" 节点消息。我希望Peer包含的所有消息都有不同的名称。因此,对等方不能有两条同名的消息。
+--------+ +-----------+
| PEER |◄►-- in 0..* --> | MESSAGE |
+--------+ +-----------+
|name:String|
+-----------+
但是在模型中,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>
答案 0 :(得分:0)
OCL约束确实会阻止这种情况(或者更好的说,你可以通过在执行结束时评估这个OCL约束来检查ATL转换是否产生了不一致的模型)
答案 1 :(得分:0)
ID=true
将使验证产生错误,并显示以下消息:The ID '...' of '...' collides with that of '...'
要验证您的模型,请使用例如:Diagnostician.INSTANCE.validate(eObjectToValidate)