从个人版开始我就开始使用EA,然而当时刚接触的时候还真是觉得这个工具并不人性化,又不好使用,所以个人版的图画的是真心不如意。不过用的时间久了,发现EA是真心强大的工具。下面我多EA的强大功能的总结就从数据库设计开始吧。 合作开发时间紧任务急,所以在统一了系统功能后,其他组员分别负责需求分析文档和画界面,我的任务就是建立数据库,其实在一开始的时候我也是知道EA具有画表的功能,只是当时并没有运用,数据库代码就是自己写的,所以这次觉得好好尝试下用EA建数据库。
首先打开EA,创建项目,添加一个包命名为表,这都是最基础的操作就不多做介绍,将table拖入到操作区域,,对标进行命名,添加表名称,和构造类型,(作者部分是自己添加的),在数据库选项中可以选择要生成代码的数据库类型,在这里我选择了sql server 2008(生成代码时需要)如图所示:
然后是字段的添加:名称即是字段的名称,可以选择主键,或者是否为空,数据类型可以根据需要进行选择,数据库中有的数据类型这里都具备,在这里最主要的还是想说初始,初始值可以自己设置,我是设置了默认值自动获得日期。(还可以对卡进行别名和备注的书写)
既然可以选择是否作为主键,那么必然就可以设置外键,那么该如何设置呢,设置成功后的样子如图所示:
那么是如何创建呢,其实很简单只要连接两个表,然后右键,选择外键即可。
我们从创建的表可以看出,有红色部分和蓝色部分,是为什么有这样的区别呢,根据经验我们可以得知上面的部分为属性,下面的部分为方法。所以这里将创建主键设置为一个方法,所以这样说我们的创建存储过程,视图,触发器等是不是也可以在这里创建呢?果然不出所料,添加方法可以得出(如图所示可以穿件不同的构造类型):
现在真个表穿件的差不多了,那么将要做的就是如何将创建的表导出为sql语句呢,右键可得导出为sql,界面如图:可以选择创建主键,生成索引,触发器等都可以,还可以单个生成或者是生成一个表的sql语句,生成的代码可以直接在sql中运行创建一个完整的数据库了,这里就不展示数据库代码了。
除了创建表示这次运用的新功能外,还发现上次的一个错误,就是在创建实体类的时候对EA的运用,似乎出了些问题,其实也就是对EA的功能不熟悉造成的,我们先看下我两次画的图有什么不同:
其实看上去似乎没有多大差别,到那时明显后面的上多了property,我想不用我说大家都摘掉property代表着什么,这是我们在VB.NET中声明属性的时候用的关键字,那么显然第一张图和普通的类没有什么区别,固然不会自动生成实体。那么这个差别是如何形成的呢?其实只要再属性创建时勾选属性选型,再将弹出框中的名称进行修改便可以得到实体的属性字段!(如图所示:)
那么我们来看一下这两种形式的图,生成的代码有什么样的区别:(选取部分代码)
第一种图的代码,显然将实体的属性定义为方法不合理:
Private enUserName As String
''' <summary>
''' 用户状态
''' </summary>
Private enUserStatus As String
''' <summary>
''' 级别
''' </summary>
Public Function Level() As String
Level = ""
End Function
''' <summary>
''' 新密码
''' </summary>
Public Function NewPwd() As string
NewPwd = ""
End Function
第二种图的代码,则是我们想要的,开始我以为办不到,原来是因为我没有好好研究:
''' <summary>
''' 用户名
''' </summary>
Private enUserID As String
''' <summary>
''' 用户姓名
''' </summary>
Private enUserName As String
''' <summary>
''' 用户级别
''' </summary>
Public Property Level() As String
Get
Return enLevel
End Get
Set(ByVal Value as String)
enLevel = Value
End Set
End Property
''' <summary>
''' 用户状态
''' </summary>
Public Property LoginStatus() As String
Get
Return enLoginStatus
End Get
Set(ByVal Value as String)
enLoginStatus = Value
End Set
End Property
第三个让我觉得厉害的地方,就是关于类实现接口,类继承于抽象类等的功能,开始觉得这个没有办法体现出来,所以生成的代码必然也不会是我想要的,然而事实却远非我想的那样,EA远比我想的强大,先拿DAL和IDAL来说这个问题,因为DAL的所有方法基本都是实现的IDAL,所以大致方法一样,当初我想的是如果只画IDAL,用实现的箭头连接,那么DAL中就会出现IDAL的方法,就会节约时间,而且也不会担心我会忘记方法,所以就在工厂里,添加了两个包的链接,将各包重的类以链接的方式放在工厂里,然后用DAL实现IDAL,果然不出我所料,接口的方法都会复制到DAL中,而且在代码中也会有体现:下面是图和代码:
IDAL的代码:(代码太多只展示部分)
''' <summary>
''' 用户信息表的修改
''' </summary>
Private Interface IUser
''' <summary>
''' 添加新用户方法
''' </summary>
''' <param name="enUser"></param>
Function AddUser(ByVal enUser As UserEntity) As Integer
''' <summary>
''' 修改用户密码 修改密码时需要
''' </summary>
''' <param name="enUser"></param>
Function ChangePwd(ByVal enUser As UserEntity) As Integer
''' <summary>
''' 删除用户(需要判断要删除用户是否处于登录状态)
''' </summary>
''' <param name="strUserId"></param>
Function DeleteUser(ByVal strUserId As String) As Integer
Imports Model.机房收费系统.Entity
Imports Model.机房收费系统.IDAL
Namespace 机房收费系统.DAL
''' <summary>
''' 用户信息 登录时使用 继承与IUser
''' </summary>
Public Class UserDAL
Implements 机房收费系统.IDAL.IUser
''' <summary>
''' 添加新用户方法 参数还未确定
''' </summary>
''' <param name="enUser"></param>
Public Function AddUser(ByVal enUser As UserEntity) As Integer Implements IUser.AddUser
AddUser = 0
End Function
''' <summary>
''' 修改用户密码 修改密码时需要
''' </summary>
''' <param name="enUser"></param>
Public Function ChangePwd(ByVal enUser As UserEntity) As Integer Implements IUser.ChangePwd
ChangePwd = 0
End Function
''' <summary>
''' 删除用户(需要判断要删除用户是否处于登录状态)
''' </summary>
''' <param name="strUserId"></param>
Public Function DeleteUser(ByVal strUserId As String) As Integer Implements IUser.DeleteUser
DeleteUser = 0
End Function
由代码可以看出,包括DAL对实体的引用对IDAL的引用都可以在代码中完全展示,不得不让我惊喜,更是让我觉得工具真心强大。
EA的功能暂时只觉得这些是值得我弄明白的,当然看上去还有很多我没有弄清楚的功能在等待我的挖掘,唯一让我不满的的是每一个类都在一个命名空间里,不知道这样是为了安全还是什么,但是觉得调用的时候不方便,而且在把代码导入到VS后会出现一些因为命名空间和引用的问题,暂时没有想到好的解决办法,(很大可能是因为我建的包不合理的问题)。