GMF中的Link有兩個,分別是基于Type的和基于Reference的。對于前者,在ecore模型中有一個類對應這個連接,創建一個連接即創建了該類的一個實例,試想,如果一個模型比較復雜,有很多連接時,這種方法要在模型中要為連接建立很多與業務無關的類,使得模型非常復雜;對于后者,沒有必要為每個連接在ecore中建立一個類,而是設置該連接對應的Reference即可。下面用一個school的模型來說明基于Reference的連接的建立方法,這個模型非常簡單,如下圖(用gmf插件生成的對應school.ecore的school.ecore_diagram):一個學校里邊有很多老師和學生,每個老師會指導多個學生,這里的指導關系是Teacher類的一個Reference,名字為tutoringStudents,我們打算在GMF編輯器中用Node來表示老師和學生,老師對學生的指導關系用Link來表示。

該模型命名為school.ecore, 然后生成school.genmodel,再按照常規方法建立school.gmfgraph, school.gmftool.
最后建立最關鍵的school.gmfmap,首先為mapping元素建立兩個Top Node Reference,分別對應Teacher和School,然后建立代表老師指導學生關系的link mapping,其屬性頁中各項按照下圖指定值:
注意,Domain meta information中前三項都空著,只在最后一項中指定代表該連接的Reference即可。Validate無錯后,生成school.gmfgen,在生成Diagram code,最后運行效果圖如下:

看一下保存semantic model的school文件:
<?xml version="1.0" encoding="UTF-8"?>
<School:School xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:School="http://example.School">
<teachers name="ProfessorLi" tutoringStudents="//@students.0 //@students.1"/>
<students name="Tom"/>
<students name="Mary"/>
</School:School>
該模型命名為school.ecore, 然后生成school.genmodel,再按照常規方法建立school.gmfgraph, school.gmftool.
最后建立最關鍵的school.gmfmap,首先為mapping元素建立兩個Top Node Reference,分別對應Teacher和School,然后建立代表老師指導學生關系的link mapping,其屬性頁中各項按照下圖指定值:
注意,Domain meta information中前三項都空著,只在最后一項中指定代表該連接的Reference即可。Validate無錯后,生成school.gmfgen,在生成Diagram code,最后運行效果圖如下:
看一下保存semantic model的school文件:





