【问题标题】:avoid duplicates in a Ecore containment relation避免 Ecore 包含关系中的重复项
【发布时间】: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”关系中,我希望所有元素都应该隐含在元模型中

标签: emf ocl ecore


【解决方案1】:

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

【讨论】:

  • 所以无论如何我都应该手动删除重复项..mm..有没有办法避免手动修改?例如,代替将 IN 关系定义为数组,它可以定义为“集合”,因此将忽略等效元素。这可能吗?
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多