在EMStudio中静态建模的概念和内容是来自于UML标准的,所以EMStudio提供的静态建模的设计能力是完全可以满足开发者的设计要求的。但是与UML标准比较,EMStudio中的静态建模还存在两个不同的特色:
1. 类与实体的概念是一致的
也就是说,在EMStudio的静态建模中类和实体是完全相同的两个概念。这与目前大部分的书籍和资料的表述是不同的。EMStudio这么做是因为定位问题,同时也给开发者提供了完成静态建模即完成数据库设计的便利。
2. 静态建模和数据库设计高度统一
在EMStudio中静态模型的设计和数据库的设计是完全结合在一起的,开发者完全可以通过静态建模一个步骤完成两种设计工作。另一个高度结合的体出现在与,实体的继承特性在数据库设计过程中也得到充分和完善的体现。所以开发者实际上是用面向对象的方法完成数据库设计的。
下面开始具体介绍EMStudio的静态建模部分的内容。
一.创建工程及实体
1.创建新工程
首先运行EMStudio,主界面显示后从主菜单选择FileàNew Project,完成新工程的创建,工程的默认名字是“MyProject”。在实体模型视图(Entity Model)中会显示新建的工程,如下图所示:
2.定义新实体
下面开始定义一个新的实体。鼠标右击工程节点,在弹出菜单中选择:New—>Simple Entity,完成一个简单实体的定义。完成操作后实体模型视图会显示新的实体,其位置是作为工程节点的子节点,如下图所示:
展开实体Entity1节点,可以看到实体包含的内容:索引,成员(等同于字段),关系和触发器。这个一个实体和数据表应该有的一些内容。
二.实体设计器的使用
双击实体节点Entity1可以打开实体设计器,在实体设计器中可以完成与实体有关的绝大部分设计和编辑工作。双击后显示界面如下:
实体设计器通过不同Tab页来组织实体包含的不同内容。在当前显示的属性页中可以编辑实体自身的属性。我们可以将实体的名字改为一个更有实际意义的名字。点击Name属性,然后输入“Company”,按回车。这样就完成了实体名字的修改。可以观察一下,此时实体模型视图中的实体名字也显示为“Company”。其它属性介绍如下:
Comment:
是对实体的说明性文字
Entity Type:
实体类型。由于我们创建的是简单实体,所以这里显示的Simple。这个属性是不可修改的。另外两个类型是组合(Comb)和关系(Relation),这两种类型的实体会在后续的章节中介绍。现在先了解简单实体的内容。
IsAbstract:
用于指定当前的实体是否为抽象的。
IsAECC:
表示当前实体是否为一个容器实体,该属性不可修改。关于容器实体我们也是在后续相关章节中再介绍。
好,现在点击Member页,切换到实体成员的设计界面,然后点击Add按钮定义一个新的实体。操作完成后界面如下图所示:
点击Name属性,输入“CompanyName”,按回车,完成成员的名称修改操作。
除了关系和实体属性以外,成员,索引和触发器的定义和修改都是使用相同的操作方式完成的。如果要删除,那么先选中需要删除的项,然后点击Delete按钮就可以了。这里需要注意一个成员属性,那就是“Mapping Field”属性。这个属性表示当前的成员是否对应于数据表中的一个字段。如果选择是,那么在生成数据库时数据表中就会有这个字段,否则就没有,EMLib框架在完成各种ORM功能时也不会处理这个成员。
读者可以切换到索引页和触发器页,定义新的索引和触发器,看一下其中内容。读者可以发现索引和触发器的内容和Sql数据库是一致。这是因为新创建的工程默认是使用Sql数据库的。如果需要修改的话,选择主菜单:ProjectàSetting,在设置界面中修改。这个操作会在后续内容中介绍。现在选择主菜单FileàSave,完成工程的保存操作,因为后续的介绍需要使用到这个工程。
三.创建实体图和关系
1.创建实体图
鼠标右击工程节点,在弹出菜单中选择NewàEntity Diagram菜单项,完成实体图的创建。操作完成后,实体模型实体中会出现新的实体图节点,如下图所示:
鼠标右击实体图节点,在弹出菜单中选择Property菜单项。在实体图的属性编辑界面中将实体图的名字修改为Main,然后按OK按钮返回,完成实体图的改名操作。
2.定义新关系
双击实体图节点Main打开实体图,在主窗体的客户区就会显示实体图的内容。当然现在显示的实体图还没有任何内容。用鼠标在实体模型视图中选中Company实体节点,然后以Drag/Drop方式将该实体放置到在客户区打开的实体图中,Drop的位置请靠近左上角,以方便后面的操作。操作完成后的结果如下图所示:
由于关系存在于两个实体之间(当然自反关系是一个例外),所以我们还需要定义一个新的实体。在实体图工具条上选中简单实体按钮,如下图所示:
在实体图中的空白处按下鼠标左键,然后以Drag/Drop方式向右下方向拉出一个方框,再释放鼠标左键。这样就完成了一个新实体的定义,如下图所示:
请将该实体的名字改为Employee。现在就可以开始定义新的关系了,选择实体图工具条中的Composition按钮,如下图所示:
然后将鼠标键移动到Employee实体上,按下鼠标左键,以Drag方式将鼠标移动到Company实体上,然后释放鼠标左键,这样就完成了一条新关系的定义。如下图所示:
3. 修改关系的名称
在实体图中,鼠标右击关系,在弹出菜单中选择Property菜单项,打开关系编辑界面。然后选择Name属性,将名字改为HasEmployee。
四.关系的属性
在开始介绍关系属性之前,先明确关系主方和付方的概念。从图形上来说,关系箭头所指方是关系的主方,而另一方就是关系的付方。对于刚才创建的关系来说Company实体是主方,Employee实体是付方,这表示Company实体包含1个或者多个Employee实体。关系的名称修改完成后,请展开关系属性界面中所有节点,如下图所示:
下面开始逐个介绍关系的属性,这部分的内容很重要,因为静态模型的精华是在于关系。
Comment:
对关系的说明
Enable Navigate Primary:
在UML标准中,关系的双方对对方的知晓(ware)往往是单向的。双向知晓会在源代码中出现互相引用的情况,这是高耦合的一个标志。所以通常的情况下这个属性一般是设置为false。但是在某些情况确实会需要互相知晓对方的情况。比如,树形控件中的父节点有子节点属性,从而父节点可以知道所有的子节点;同时子节点有一个父节点属性,从而子节点可以知道父节点。这个时候,我们就可以将该属性设置为true。
这个属性的值也会影响到EMLib的ORM操作。如果设置为true那么在级联的实体激活操作中EMLib不仅会激活实体以及付方实体,并且还会根据该属性值激活或者初始化付方实体中表示主方实体的属性。从而让付方实体可以访问到(或者说感知到)主方实体。
Foreign Key Options:
这部分是与外键相关的属性。在EMStudio的静态模型中,实体间关系会以外键的方式映射到相关的数据表中。所以这个部分属性允许开发者设置外键的属性。
Foreign Key Options—Name:
这个属性用于设置外键字段的名称。这是目前开发者能够修改的唯一属性。外键的类型属性是不允许修改的,EMStudio会根据当前所使用的数据库自动确定。
Minor Entity Name:
付方实体的名称,在创建关系时确定,无法修改。
Minor Multiplicity:
表示付方实体的数量,“1”和“0..1”表示单;“0..*”和“1..*”表示多。这和UML标准是一致的,含义也没有变化。
Minor Options:
这部分的属性用于设置付方实体的内容。
Minor Options—Active:
EMLib使用这个属性确定,在执行级联的激活操作中是否激活这个关系的付方实体。设置为true表示需要在级联激活中激活付方实体,false表示不激活。请将其改为true。
Minor Options—Delete:
EMLib使用这个属性确定,在执行级联的删除操作中是否删除这个关系的付方实体。设置为true表示需要在级联删除中删除付方实体,false表示不删除。
Minor Options—Property Name:
关系在源代码中是通过属性来体现的,在EMStudio的静态模型中这样的属性称为关系属性。关系属性出现在主方实体中,表示主方知道付方存在并可以访问。这个属性用于设置源代码中关系属性的名称。为了在生成的源代码中看到效果,请将其改为HasEmployee。
Primary Multiplicity:
表示主方实体的数量,“1”和“0..1”表示单;“0..*”和“1..*”表示多。这和UML标准是一致的,含义也没有变化。
Primary Entity Name:
主方实体的名称,在创建关系时确定,无法修改。
Relation Type:
关系的类型,在创建关系时确定,无法修改。
最后介绍一下Enable Navigate Primary属性,请将其值改为true,然后就会出现一个新的属性:Primary Options。Enable Navigate Primary属性的值设置为true以后,表示付方实体需要感知主方实体,这在源代码中也是通过属性来实现的,这和上文提到的树形控件的作法类似。Primary Options中的属性就允许开发者设置该属性的名称。请关闭实体设计器界面,返回主界面,然后保存工程。
五.编译工程及生成源代码
1.设置源代码输出目录
在生成源代码前先确认一下源代码输出的位置。请选择主菜单ProjectàSetting菜单项,打开设置项目界面,如下图所示:
窗体中最下面那个Output Path设置项就是定义源代码的输出路径。默认是在C盘,由于在笔者的电脑上可以使用这个目录所以笔者就没有修改。请读者确认在自己电脑上运行EMStudio时,EMStudio对指定目录拥有写的权限。
2.编译工程
这一步不是必须的,因为直接生成源代码话,EMStudio也会自动先执行编译,没有错误以后才会生成源代码。请选择主菜单ProjectàCompile菜单项执行编译操作。如果读者是严格按照上述步骤做下来的话,应该是通不过编译的,会产生如下的两个错误:
第一个错误是说:实体Employee没有任何成员。请双击该错误,打开实体Employee的设计界面,然后为实体Employee定义一个新的成员,名字是MyBirthday,类型是DateTime。
第二个错误是说:连接字符串无效。请双击该错误打开设置项目界面,如前图所示。现在读者有两个选择,其一是点击“New Connection”按钮新建一个真实的连接从而得到一个连接字符串。其二是在“Connection String”文本框中输入任意非空非空格的有效字符串,比如“abc”之类的就可以。为简便起见现在先输入“abc”。
好,保存工程,再次执行编译操作,这是就应该可以成功通过编译了。在输出窗口可以看到成功信息,如下图所示:
3. 生成源代码
选择主菜单ProjectàBuild Source生成源代码。请确认在设定的源代码输出位置生成了源代码文件。
六.源代码解读
在指定的源代码输出目录中,会存在一个名为MyProject文件夹。这个名称来自于项目的工程名。请打开该文件夹,会有一个名为C#的文件夹,这表示我们生成的是C#语言的源代码。源代码的语言类别在设置项目界面中是可以修改的。请打开该目录,会看到如下所示的目录,如下图所示:
EDModel.Biz.EDCustom文件夹中文件是以实体类为单位的,一个实体对应一个文件,开发者如果需要写自己定制的代码可以写在这些文件中。在将代码添加到自己的项目中时请使用复制的方式添加,这样重复生成代码时自己写的代码就不会被覆盖。EDModel.Biz.EDExtern文件夹中两个文件。MyProject.xml称作模型文件,在初始化EMLib框架时需要这个文件。另一个是EDModel.cs文件,该文件体现了当前实体模型的静态结构。所以将该文件添加到工程时请使用引用添加,这样重复生成源代码后可以保证当前工程中是最新的代码。开发者不能修改该文件中的代码,否则会导致EMLib框架无法正常使用。
现在打开EDModel.cs文件看一下其中的内容。首先看命名空间namespace MyNamespace,这个名字是可以修改的,在主菜单ProjectàSetting菜单项,打开项目设置窗体,然后在其中编辑Namespace就可以了。MyContext这个类是用于初始化EMLib和生成EMContext对象的类,以后在介绍Eql是会提到它。这个类的名字可以在项目设置界面的Context Class Name中修改。
在MyContext类后面是若干个继承自EqlEntityMeta的类,这些类称为数据表元类。数据表元类中的成员和数据表中的字段是对应的,并且在MyContext类中会有每一个元类的成员。这样的设计是为了方便Eql的使用。如何使用Eql会在其它相关部分中再做介绍。接着元类的就是实体类了。请读者确认一下每一个实体类的成员是否和设计时定义的是一致的。由于我们定义了一个关系,所以在主方实体Company中会有关系属性HasEmployee,这个名字和设计时指定的是一致的。另外由于我们指定关系的Enable Navigate Primary属性为true,表示付方实体可以感知主方实体,所以在付方实体Employee中存在关系属性Host_Relation9,这个属性表示付方实体对应的主方实体。
在项目设置中的Entity Model设置页,有一个选项Serializable,这个设置项用于控制是否在生成的源代码中给实体类加入Serializable属性。
七.与模型相关其他一些操作
1.删除操作
在EMStudio中删除操作有两种:从模型中删除和从实体图中删除。请打开实体图,然后鼠标右击实体Employee,在弹出菜单中选择DeleteàDelete From Diagram菜单项。可以看到实体Employee从实体图中消失了,但是在实体模型视图中Employee实体还是存在的。这个意思是刚才操作只是从实体图中删除了一个表示实体的图形符号,而不是实体本身。现在选择主菜单EditàUndo菜单项(或者快捷键CTRL+Z),执行Undo操作,可以看到图形又恢复了。然后再次在实体图中右击Employee实体图形,在弹出菜单中选择菜单DeleteàDelete From Model菜单项。可以看到Employee实体从实体图和实体模型视图中都消失了。这表示实体Employee实体被真正的从模型中完全删除了,模型中已经不存在Employee这个实体了。
2.包的使用
在EMStudio中包是一种用来组织模型的工具。在实体模型视图中,用鼠标右击工程节点,在弹出菜单中选择NewàPackage菜单项就可以定义一个新的包了。EMStudio中包的含义和UML中一致。通过右击包节点,开发者可以在包内定义其它内容。
3.查找
EMStudio中查找分两种:查找和引用查找。所谓查找是一般意义上的查找,引用查找是指查找一个实体在当前的实体模型中在那些地方被引用到。先介绍查找。选择主菜单EditàFind菜单项,打开查找界面。如下图所示:
在Find what文本框中输入Com,在Search in组合框中选择Project,在Search types中只选择Entity,Match case和Match whole word复选框不要选上,然后点击Find按钮。在Find Results视图中就会显示查找结果,如下图所示:
这个结果表示实体Company在静态模型中存在于两个位置,一个是在模型MyProject的Main实体图中,另一个是在模型MyProject中。请双击第一个查找结果,实体图会被自动打开,并且实体Company在实体图中是被选中的。
在实体Employee中定义一个新的成员,名字是PreviousCompany,类型是Company类型。然后在实体模型视图中右击实体Company,在弹出菜单中选择Find All References菜单项,就会查找实体Company所有被使用到的地方,结果如下图所示:
结果表示实体Company在当前的静态模型中,在两个不同位置被使用到。读者可以双击这两个结果,实体Company被使用到的地方会自动打开。
本节内容到此已全部讲述完毕,如果有疑问,或者需要技术支持可以访问我们网站:http://www.WideUnion.com。提出您的问题或者在论坛中提交问题,同时我们也非常希望能听到您的建议和需求,以便我们为您提供更好的产品和服务。