使用PowerDesigner的物理模型生成不同的数据库和转换成OOM模型生成CS实体类代码

转:http://blog.csdn.net/huwei2003/article/details/6123065    第 五      使用PowerDesigner的物理模型生成不同的数据库和转换成OOM模型生成CS实体类代码

5.使用PowerDesigner的物理模型生成不同的数据库和转换成OOM模型生成CS实体类代码

PowerDesigner的物理模型保存的文件是用XML来描述模型结构的格式,所以它不会受任何数据库类型的影响。假如我们刚开始的例子是使用sql2000数据库创建的物理模型,那么现在使用PowerDesigner能马上生成一份Oracle、DB2、Mysql或Access数据库的创建脚本。选择Database工具栏中的Change Current DBMS菜单,将以前的Microsoft SQL Server 2000改为MySQL 5.0,以前sql2000数据库的模型摇身一变成了MySQL,在Preview选项卡里面我们就能看到MySql的drop table if exists的sql语法了 ,这里需要注意的是转换过程中可能会出现一些错误,可能是因为你在模型里使用了某种数据库特有的一些语法或功能,在新选择数据库内不能被支持使用,所以建议从一开始就使用规范的一些SQL语法建立数据库为后面有可能移植转换做考虑,之前还提到了使用Domian自定义类型,这里就能很好的应用,如修改当前时间的自定义类型的默认值为CURDATE()即可修改所有引用字段以支持MySql数据库,或修改autoId自定义类型为其他非int类型为表的主键等等。

PowerDesigner里面各种模型是能实现无缝隙进行相互转换的。还是以刚开始会员为例子,我现在建好了物理模型需要转换为OOM模型,并把数据库所有表映射生成cs代码实体类。点击Tools工具栏选择Generate Object-Oriented Model菜单,选择生成OOM对象的语言,这里以C# 2.0为例,如果物理模型表里的Name为中文转换生成的OOM类对象字段里面也全是中文的话,请确保在转换时OOM Generation Options里的Detail选项卡内的Convert names to into codes没有被选中。转换成功后我们可以在OOM里面看到会员对象的一些关系和生成cs代码如下图:

从图片可以看出,会员与会员类型是1对1关系,而会员类型可以对应多个会员。所以生成的cs代码里会员表没有会员类型编号字段,而有一个FA_MemberType类型的属性,代表当前会员的会员类型,而会员类型表里面会多一个System.Collections.Generic.List<FA_Member>属性,代表当前会员类型的所有会员列表集合,PowerDesigner把这些面向对象的思想真的表现得淋漓尽致。但有时候我们需要的实体类是数据库内原分不动的字段映射过来,而不需要FA_MemberType类型的属性只要一个包含memberTypeId字段的完整会员表实体怎么办?我这里介绍一个简单的办法,在物理模型转换为OOM对象模型前先把表之间的所有References主外键关系全部删除掉,可能删除表的主外键关系时会PowerDesigner也会把主从表的主外键列也全部删除去,设置Tools工具栏Model Options里Reference选项里的Auto-migrate columns勾去掉即可。删除后不保存之前的物理模型直接转换成OOM后再Ctrl+Z恢复之前删除的References,这时可以看到OOM模型里面的会员类对象便是数据库会员表所有字段原分不变的映射。另外,OOM模型可以直接生成VS的工程文件带所有cs实体类文件,那么,我们使用PowerDesigner建立好数据库的物理模型后,又可转换成OOM对象模型轻松生成cs代码实体类。

可能有些朋友的PowerDesigner打开工程Preview里看到的不是我这样的cs代码,而是一些public int MemberId之类的字段,这是因为PowerDesigner将物理模型转换到OOM对象模型的时候表的所有字段是被变成类模型里面的Attributes,而Attributes配置生成的模板默认是不带有get和set访问器的,修改Language工具栏Edit Current Object Language菜单找到Profile > Attribute > Templates > definition修改模板即可。我的C#2.0模板如下:

.
if
 (
%
isGenerated
%
) and (
%
isValidAttribute
%
)
[

%
comment
%
/n]/
[

%
oidDocTag
%
/n]/
[

%
customAttributes
%
/n]/
   .

if
 (
%
Multiple
%
 
==
 
false
) and (
%
isIndexer
%
 
==
 
false
)

private [


%
flags
%
 ]
%
dataType
%
 
%
fieldCode
%

=
 
%
InitialValue
%
];

[


%
visibility
%
 ][
%
flags
%
 ]
%
dataType
%
 
.convert_name(

%
fieldCode
%
,,
"
_
"
,FirstUpperChar)
{
   get { 

return
 
%
fieldCode
%
; }
   set { 

%
fieldCode
%
 
=
 value; }
}

   .


else

private [


%
flags
%
 ]
%
dataType
%
[
%
arraySize
%

%
fieldCode
%

=
 
%
InitialValue
%
];

[


%
visibility
%
 ][
%
flags
%
 ]
%
dataType
%
 
.convert_name(

%
fieldCode
%
,,
"
_
"
,FirstUpperChar)
{
   get { 

return
 
%
fieldCode
%
; }
   set { 

%
fieldCode
%
 
=
 value; }
}

   .endif
.endif

Java 5.0带get和set访问规则Bean对象生成模板如下:

.
if
 (
%
Multiple
%
)
[

%
javaDocComment
%
/n]/
private [

%
flags
%
 ]
%
dataType
%
/[/] 
%
fieldCode
%

=
 
%
initialValue
%
];


%
visibility
%
 
%
flags
%
 
%
dataType
%
/[/] get
.convert_name(

%
fieldCode
%
,,
"
_
"
,FirstUpperChar)
()
{
   

return
 
this
.
%
fieldCode
%
;
}

%
visibility
%
 
%
flags
%
 
%
dataType
%
/[/] set
.convert_name(

%
fieldCode
%
,,
"
_
"
,FirstUpperChar)
 (

%
dataType
%
 
%
fieldCode
%
)
{
   

this
.
%
fieldCode
%
 
=
 
%
fieldCode
%
;
}
.

else

[

%
javaDocComment
%
/n]/
private [

%
flags
%
 ]
%
dataType
%
 
%
fieldCode
%

=
 
%
initialValue
%
];


%
visibility
%
 
%
dataType
%
 get
.convert_name(

%
fieldCode
%
,,
"
_
"
,FirstUpperChar)
()
{
   

return
 
this
.
%
fieldCode
%
;
}

%
visibility
%
 
void
 set
.convert_name(

%
fieldCode
%
,,
"
_
"
,FirstUpperChar)
 (

%
dataType
%
 
%
fieldCode
%
)
{
   

this
.
%
fieldCode
%
 
=
 
%
fieldCode
%
;
}
.endif

PowerDesigner几乎所有模型转换生成都可以使用模板来配置,这样能充分的让用户自定义来实现想要的功能。

PowerDesigner的OOM功能远远不只这一些,最重要的是使用UML建用例图了,在面向对象里面的继承、多态,面向接口编程,对象之间的依赖、包含等关系也能在这里一一体现,不同的箭头线条各自代表着不同的意思,也能够生成一些cs伪代码,由于本文主要将PDM物理模型,这里就不再赘述。不知那些大师也会不会使用PowerDesigner或Rose来画画图呢?


版权声明:本文为zhangrun1原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>