我有一个 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>