我是MDSD / EMF的新手,但由于Eclipse的支持,我取得了很大的进步。
我创造了一个玩具模型,正如awynne建议的那样昨天回答,我非常接近。我只使用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并将其与特定的Widget相关联。
如果遇到任何人,生成的EMF编辑器代码中存在错误:
当我尝试向ReferenceContainer添加多个WidgetReference时,树编辑器仅显示ReferenceContainer下的第一个WidgetReference。如果我单击树中的WidgetReferences项,它会在属性视图中显示多个WidgetReferences。它只是不允许我在树中看到它们,因此不会让我选择它们来更改它们的引用以将它与实际的小部件相关联。
解决方法是根据需要创建任意数量的引用,保存并关闭模型,然后重新打开它。重新打开后,将显示所有参考文献。
感谢您的帮助/指导。
杰夫
答案 0 :(得分:4)
我认为你的问题的答案与“遏制”的概念有关。对子对象具有包含引用(在EMF元模型中为containment = true)的任何父对象都管理该子对象的生命周期。因此,在创建子项时,父项对该对象的引用会自动生成。如果引用不是类型包含(containment = false),则可以将引用指向任何正确类型的现有模型对象。我认为您需要将引用设置为containment = false。
我没有使用Acceleo所以让我们使用EMF树编辑器作为示例(该概念也适用于GMF编辑):在树编辑器中,如果父对象具有对子项的包含引用,则用户能够通过右键单击父级并选择“new - > child - > ChildObject”来创建子级。如果对子项的引用不是类型包含,则用户将能够通过单击父对象的属性窗口中的相应子属性来选择模型中已存在的该对象的实例。
这有帮助吗?如果此描述令人困惑,则可能有助于创建具有一些非包含引用的玩具模型并为其生成EMF编辑器。
答案 1 :(得分:0)
我不确定EMF中模型之间引用的概念是您所描述的。但是,在做的模型中,可以引用其他模型中的元素。在Generic EMF编辑器中,您可以创建模型实例,单击右键,然后选择“加载资源...”。该新资源可以是与您的模型相关的任何其他模型(您的元模型引用其他模型的元模型)。
你也可以在元模型层面上做到这一点。在图形Ecore编辑器中,您可以从其他元模型中拖放类。他们将保持同步。
但是,我不确定这是否是你所要求的。