【发布时间】:2014-04-29 08:21:13
【问题描述】:
我有一个 Ecore 元模型。节点 Peer 与节点 Message 有一个名为“in”的包含关系 0..*。我希望 Peer 包含的所有消息都有不同的名称。所以一个 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 有许多相同的消息。我希望该约束隐含在元模型中,而无需在 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>
【问题讨论】:
-
那么您正在寻找帮助您编写 OCL 约束的人吗?建议不同的方法来实现相同的目标?还是什么?
-
我正在寻求实现这一目标的最佳方法。我不确定 OCL 可能是最好的解决方案。如果没有 OCL 可以做到,那就更好了。我的目标是避免手动控制元素是否已存在于“in”关系中,我希望所有元素都应该隐含在元模型中