今天研究了一下通过PowerDesigner生成实体类和NHibernate所需要的xml文件,方法是通过Power Designer的向对象模型 (OOM) 导出并配置相关模板,具体操作步骤如下:
第一步:创建OOM
在PowerDesigner中创建面向对象模型 (OOM)。
我首先创建物理数据模型 (PDM),然后在 Tools → Generate Object-Oriented Model 做了转换。
第二步:配置导出实体模板文件
菜单位置:Language → Edit Current Object Language
General:C# 2::Profile\Attribute\Templates\definition
我对模板进行了简单修改,添加了一行空格和 { get; set; }。又对文件头和字段描述的格式做了修改。
DefaultHeader
位置在:C# 2::Profile\Classifier\Templates\DefaultHeader
写自己的代码:
// -------------------------------------------------------------------------------------------------------------------- // <copyright file="%sourceFilename%" company=""> // XXXX系统 // </copyright> // <summary> // %Comment% // </summary> // --------------------------------------------------------------------------------------------------------------------
[%comment%\n]\
位置在:C# 2::Profile\Shared\Templates\comment
写自己的代码:
/// <summary> /// %CurrentLine% /// </summary>
提示:在做类时只有把Comment字段填上,导出是才会有字段描述。
对命名空间进行配置,我直接写到了 source 里面感觉不是太合适。
C# 2::Profile\Classifier\Templates\source
现在就可以将实体导出了。
菜单位置:Language → Generate C# 2 Code
第二步:配置导出NHibernated的xml模板文件
这个是通过在网上查资料学来的,
感谢:用Powerdesigner生成NHebernate的MAP文件
只是他没有附图,让人找不到位置,我也研究了一个下午才找到的,以下参数命名仍采用他的。
1.还是打开 Object Language Properties
菜单位置:Language → Edit Current Object Language
在 C# 2::Profile\Classifier\Generated Files ,创建一个 hbm.xml 文件。
Name: hbm.xml
FileName:%topContainerCode%.hbm.xml
Comment:
.if (%isGenerated%)
.set_object(_usingContext,,new)
[\ %NHebernateHead%\n]\
%NHebernateBody% \n
%NHebernateFoot%
.endif
%NHebernateBody%
2.设置%NHebernateBody%模板的内容
在 C# 2::Profile\Classifier\Templates ,新建一个模板 NHebernateBody
<?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="%Parent.path%" namespace="%Parent.path%"> <class name="%sourceFilename%" table="%sourceFilename%" lazy="true" > <id name="ID" column="ID" type="Guid" > <generator class="assigned" /> </id> \n .foreach_item(Attributes) .if(%dataType% == "string") <property name="%Code%" type="String"> <column name="%Code%" /> </property> \n .endif .if(%dataType% == "int") <property name="%Code%" type="Int32"> <column name="%Code%" /> </property> \n .endif .next </class> </hibernate-mapping>
具体里面的配置我还没写好,需要再查帮助。
3.配置输出NHibernate的xml文件
在 C# 2::Profile\BasePackage\Templates\Visual Studio ,将模板修改为:
.// Declare classifiers of the package .foreach_item(Classifiers,,,%IsShortcut%==false) .if (%IsSelected%) and (%isInner% == false) <File RelPath = "%sourceFilePath%" SubType = "Code" BuildAction = "Compile" /> <File RelPath = "%sourceFilePath%\\%topContainerCode%.hbm.xml" BuildAction = "EmbeddedResource" /> .endif(\n) .next .// Declare classifiers of the subpackages .foreach_item(Packages,,,%IsShortcut%==false) .if (%isAssembly% == false) %ProjectSourceFiles% .endif .next
NHibernate的xml配置完成。最后,一起导出实体和NHibernate的.xml文件
菜单位置:Language → Generate C# 2 Code
生成的两个文件:Customers.cs 和 Customers.hbm.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
// --------------------------------------------------------------------------------------------------------------------
// <copyright file="Customers.cs" company="">
// XXXX系统
// </copyright>
// <summary>
// 账户信息
// </summary>
// --------------------------------------------------------------------------------------------------------------------
namespace
XXXX.Domain.Model
{
using
System;
/// <summary>
/// 账户信息
/// </summary>
public
class
Customers
{
/// <summary>
/// 账户ID
/// </summary>
public
string
customerId {
get
;
set
; }
/// <summary>
/// 账户名称
/// </summary>
public
string
customerName {
get
;
set
; }
/// <summary>
/// 性别
/// </summary>
public
bool
gender {
get
;
set
; }
/// <summary>
/// 地址
/// </summary>
public
string
address {
get
;
set
; }
/// <summary>
/// 电话号码
/// </summary>
public
string
phoneNumber {
get
;
set
; }
}
}
|
<?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="" namespace=""> <class name="Customers.cs" table="Customers.cs" lazy="true" > <id name="ID" column="ID" type="Guid" > <generator class="assigned" /> </id> <property name="CustomerId" type="String"> <column name="CustomerId" /> </property> <property name="CustomerName" type="String"> <column name="CustomerName" /> </property> <property name="Address" type="String"> <column name="Address" /> </property> <property name="PhoneNumber" type="String"> <column name="PhoneNumber" /> </property> </class> </hibernate-mapping>
今天的学习只是找到了实现方法,想要把模板做好,还要再看看帮助。
不怎么会写博客,望前辈批评指正。
另外对使用CodeSmith导出实体类和NHibernate做了研究。模板下载:NHibernate模板 和 我自己写的模板