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

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





