Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Eclipse emf 如何创建对现有模型对象的引用?_Eclipse Emf_Mda_Mdsd - Fatal编程技术网

Eclipse emf 如何创建对现有模型对象的引用?

Eclipse emf 如何创建对现有模型对象的引用?,eclipse-emf,mda,mdsd,Eclipse Emf,Mda,Mdsd,我是MDSD/EMF新手,但由于Eclipse的支持,我取得了很大的进步 我按照Awyne的建议创建了一个玩具模型,昨天我已经很接近了。我只使用EMF及其生成的树编辑器 以下是我的EMF元模型的摘要: - EClass: Widget - name - EClass: WidgetReference - aWidgetReference : Widget [0..1] Containment = false - EClass: WidgetContainer - myWidget

我是MDSD/EMF新手,但由于Eclipse的支持,我取得了很大的进步

我按照Awyne的建议创建了一个玩具模型,昨天我已经很接近了。我只使用EMF及其生成的树编辑器

以下是我的EMF元模型的摘要:

- EClass: Widget
  - name

- EClass: WidgetReference
  - aWidgetReference : Widget [0..1] Containment = false

- EClass: WidgetContainer
  - myWidgets : Widget [0..*] Containment = true

- EClass: ReferenceContainer
  - myReferences : WidgetReference [0..*] Containment = true

- EClass: TopLevelClass
  - myWidgetContainer    : [1] WidgetContainer    Containment = true
  - myReferenceContainer : [1] ReferenceContainer Containment = true
现在发生的是,在为模型生成的树编辑器中,我从TopLevelClass开始创建所有内容。我可以在WidgetContainer中成功创建多个小部件,并且可以在ReferenceContainer中创建单个WidgetReference并将其与特定小部件关联

如果有人遇到这种情况,生成的EMF编辑器代码中会有一个错误:

当我尝试向ReferenceContainer添加多个WidgetReference时,树编辑器仅显示ReferenceContainer下的第一个WidgetReference。如果我单击树中的WidgetReferences项,它会在properties视图中显示多个WidgetReferences。它只是不允许我在树中看到它们,因此也不允许我选择它们来更改它们的引用以将其与实际的小部件关联

解决方法是根据需要创建尽可能多的引用,保存并关闭模型,然后重新打开它。重新打开后,将显示所有参考

谢谢你的帮助/指导


Jeff

我不确定EMF中模型间引用的概念是否是您所描述的。但是,在模型中,您可以引用其他模型中的图元。在创建模型实例的通用EMF编辑器中,可以单击右键,然后选择“加载资源…”。该新资源可以是与您的模型相关的任何其他模型(您的元模型引用其他模型的元模型)

您也可以在元模型级别上实现这一点。在图形化Ecore编辑器中,可以从其他元模型拖放类。它们将保持同步


但是,我不确定这是否是您要问的问题。

我认为您问题的答案与“包容”的概念有关。任何对子对象具有包容引用(EMF元模型中的包容=真)的父对象都会管理该子对象的生命周期。因此,创建子对象时,会自动创建父对象对该对象的引用。如果引用不是包含类型(包含=false),则可以将引用指向任何正确类型的现有模型对象。我认为您需要将引用设置为containment=false

我没有使用Acceleo,所以让我们以EMF树编辑器为例(这个概念也适用于GMF编辑器):在树编辑器中,如果父对象包含对子对象的引用,则用户可以通过右键单击父对象并选择“new-->child-->ChildObject”来创建子对象如果对子对象的引用不是包含类型,则用户可以通过单击父对象的“属性”窗口中的相应子属性来选择模型中已存在的该对象的实例


这有用吗?如果这个描述令人困惑,它可能有助于创建带有一些非包容引用的玩具模型,并为其生成EMF编辑器

谢谢,迭戈,但不,这不是我要找的。我对交叉模型参考不感兴趣。我只想引用同一个模型中的对象。问题是,我无法在生成的模型编辑器中找到一种方法来实际指向模型对象的现有实例,以确保对象及其字段在对该对象的所有引用中都是相同的。