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

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

看一下保存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,再按照常規(guī)方法建立school.gmfgraph, school.gmftool.
最后建立最關(guān)鍵的school.gmfmap,首先為mapping元素建立兩個(gè)Top Node Reference,分別對(duì)應(yīng)Teacher和School,然后建立代表老師指導(dǎo)學(xué)生關(guān)系的link mapping,其屬性頁中各項(xiàng)按照下圖指定值:
注意,Domain meta information中前三項(xiàng)都空著,只在最后一項(xiàng)中指定代表該連接的Reference即可。Validate無錯(cuò)后,生成school.gmfgen,在生成Diagram code,最后運(yùn)行效果圖如下:
看一下保存semantic model的school文件:





