题
我是MDSD/EMF的新手,但由于Eclipse的支持,我取得了长足的进步。
我创建了一个像Awynne建议的昨天回答的玩具模型,我非常接近。我只使用EMF及其生成的树编辑器。
这是我的EMF Meta模型的摘要:
- 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中创建一个窗口小部件,并将其与特定的小部件相关联。
如果有人遇到此操作,则生成的EMF编辑器代码中有一个错误:
当我尝试将多个WidgetReference添加到ReferenceContainer中时,树编辑器仅显示参考文献下的第一个widgetReference。如果我单击树中的widgetReferences项目,它确实在“属性”视图中显示了多个widgetReferences。它只是不会让我在树上看到它们,因此不会让我选择它们以更改其引用以将其与实际的小部件关联。
解决此问题的方法是创建所需的尽可能多的参考,保存和关闭模型,然后重新打开。重新打开后,将显示所有参考文献。
感谢您的任何帮助/指导。
杰夫
解决方案
我认为您的问题的答案与“遏制”的想法有关。任何具有围栏参考的父对象(在EMF metamodel中continment = true)对子对象管理该孩子的生命周期。因此,当创建孩子时,父母对该对象的引用会自动进行。如果引用不是类型的coantment(continment = false),则可以将引用指向正确类型的任何现有模型对象。我认为您需要将参考设置为coartment = false。
我尚未使用Acceleo,所以让我们使用EMF树编辑器作为示例(该概念也适用于GMF Editior):在树编辑器中,如果父对象对孩子有封存的参考,则用户能够创建通过右键单击父母并选择“新的 - >孩子 - > childobject”来孩子。如果对孩子的引用不是类型遏制,则用户将能够通过单击父对象的属性窗口中的适当的子属性来选择模型中已经存在的该对象的实例。
这有帮助吗?如果此描述令人困惑,则可能有助于创建一个具有某些非携带引用的玩具模型,并为其生成EMF编辑器。
其他提示
我不确定EMF中模型之间引用的概念是您所描述的。但是,在模型中 做 可以参考其他模型中的元素。在使用创建模型实例的通用EMF编辑器中,您可以单击右键按钮,然后选择“加载资源...”。该新资源可以是与您的模型相关的任何其他模型(MetAmodel引用另一个模型的元模型)。
您也可以在元模型级别上处理。在图形生态编辑器中,您可以从其他元模型中拖放类。他们将保持同步。
但是,我不确定这是您要问的。