原文:How to Use CslaGen to Generate CSLA Data Access Layer Code
最近用起了csla,这东东没个代码生成感觉很不方便。找到了CslaGen这个工具,
优点嘛,1,图形化界面,设计BO方便;2,设计文档用xml保存,便于管理。
缺点嘛,只有DAL层的代码,权限、验证这些还得找其他模板了
本示例中的cslagen版本:Nightly Build 2012.03.11
相关工具的下载:
1,CslaGen
2,CodeSmith插件
1.数据库结构(如图1),由Mother表和Daughter表组成,后者通过Daughter字段关联到前者。
图1
Sql Script
/*
***** Object: Table [dbo].[Mother] Script Date: 08/07/2007 08:07:46 *****
*/
SET ANSI_NULLS
ON
GO
SET QUOTED_IDENTIFIER
ON
GO
CREATE
TABLE
[
dbo
].
[
Mother
](
[
ID
]
[
int
]
IDENTITY(
1,
1)
NOT
NULL,
[
Forename
]
[
nvarchar
](
15)
NOT
NULL,
[
Surname
]
[
nvarchar
](
50)
NOT
NULL,
[
BirthDate
]
[
datetime
]
NOT
NULL,
[
BirthPlace
]
[
nvarchar
](
30)
NOT
NULL,
[
LastChanged
]
[
timestamp
]
NOT
NULL,
CONSTRAINT
[
PK_Person
]
PRIMARY
KEY
CLUSTERED
(
[
ID
]
ASC
)
WITH (PAD_INDEX
=
OFF, STATISTICS_NORECOMPUTE
=
OFF, IGNORE_DUP_KEY
=
OFF, ALLOW_ROW_LOCKS
=
ON, ALLOW_PAGE_LOCKS
=
ON)
ON
[
PRIMARY
]
)
ON
[
PRIMARY
]
/*
***** Object: Table [dbo].[Daughter] Script Date: 08/07/2007 08:07:26 *****
*/
SET ANSI_NULLS
ON
GO
SET QUOTED_IDENTIFIER
ON
GO
CREATE
TABLE
[
dbo
].
[
Daughter
](
[
DaughterID
]
[
int
]
IDENTITY(
1,
1)
NOT
NULL,
[
Forename
]
[
nvarchar
](
15)
NOT
NULL,
[
Surname
]
[
nvarchar
](
50)
NOT
NULL,
[
BirthDate
]
[
datetime
]
NOT
NULL,
[
BirthPlace
]
[
nvarchar
](
30)
NOT
NULL,
[
MotherID
]
[
int
]
NOT
NULL,
[
LastChanged
]
[
timestamp
]
NOT
NULL,
CONSTRAINT
[
PK_Child
]
PRIMARY
KEY
CLUSTERED
(
[
DaughterID
]
ASC
)
WITH (PAD_INDEX
=
OFF, STATISTICS_NORECOMPUTE
=
OFF, IGNORE_DUP_KEY
=
OFF, ALLOW_ROW_LOCKS
=
ON, ALLOW_PAGE_LOCKS
=
ON)
ON
[
PRIMARY
]
)
ON
[
PRIMARY
]
GO
ALTER
TABLE
[
dbo
].
[
Daughter
]
WITH
CHECK
ADD
CONSTRAINT
[
FK_Daughter_Mother
]
FOREIGN
KEY(
[
MotherID
])
REFERENCES
[
dbo
].
[
Mother
] (
[
ID
])
GO
ALTER
TABLE
[
dbo
].
[
Daughter
]
CHECK
CONSTRAINT
[
FK_Daughter_Mother
]
INSERT
INTO Mother
(Forename, Surname, BirthDate, BirthPlace)
VALUES
(
'
Josefina
',
'
Silva
',
'
01-01-1950 0:00:00
',
'
Braga
')
INSERT
INTO Mother
(Forename, Surname, BirthDate, BirthPlace)
VALUES
(
'
Maria Antónia
',
'
Cazenga
',
'
01-01-1940 0:00:00
',
'
Malanje
')
INSERT
INTO Mother
(Forename, Surname, BirthDate, BirthPlace)
VALUES
(
'
Sarah
',
'
Johnson
',
'
01-01-1960 0:00:00
',
'
London
')
INSERT
INTO Mother
(Forename, Surname, BirthDate, BirthPlace)
VALUES
(
'
Françoise
',
'
Auteil
',
'
01-01-1965 0:00:00
',
'
Marseille
')
INSERT
INTO Mother
(Forename, Surname, BirthDate, BirthPlace)
VALUES
(
'
Martha
',
'
Kent
',
'
01-01-1961 0:00:00
',
'
Smallville
')
INSERT
INTO Mother
(Forename, Surname, BirthDate, BirthPlace)
VALUES
(
'
Pascale
',
'
Chaumier
',
'
01-01-1975 0:00:00
',
'
Avignon
')
INSERT
INTO Daughter
(Forename, Surname, BirthDate, BirthPlace, MotherID)
VALUES
(
'
Antonieta
',
'
Silva
',
'
01-01-1970 0:00:00
',
'
Gondomar
',
'
1
')
INSERT
INTO Daughter
(Forename, Surname, BirthDate, BirthPlace, MotherID)
VALUES
(
'
Ricardina
',
'
Silva
',
'
01-01-1973 0:00:00
',
'
Porto
',
'
1
')
INSERT
INTO Daughter
(Forename, Surname, BirthDate, BirthPlace, MotherID)
VALUES
(
'
Inácia
',
'
Cazenga
',
'
01-01-1960 0:00:00
',
'
Cabinda
',
'
2
')
INSERT
INTO Daughter
(Forename, Surname, BirthDate, BirthPlace, MotherID)
VALUES
(
'
Francisca
',
'
Cazenga
',
'
01-01-1961 0:00:00
',
'
Luanda
',
'
2
')
INSERT
INTO Daughter
(Forename, Surname, BirthDate, BirthPlace, MotherID)
VALUES
(
'
Marianne
',
'
Chaumier
',
'
01-01-1995 0:00:00
',
'
Le Thor
',
'
6
')
INSERT
INTO Daughter
(Forename, Surname, BirthDate, BirthPlace, MotherID)
VALUES
(
'
Nadine
',
'
Chaumier
',
'
01-01-2000 0:00:00
',
'
Pernes-les-Fontaines
',
'
6
')
2.BO层次结构(见图2)
图2
假设Mother,Daughter都是很大对象,有一堆的属性,载入他们的集合对象,开销会很大。
通常我们会设计一个轻量级的abcInfo对象(只定义些Mother/Daughter的必要信息,比如名字什么的)
,然后载入abcInfo的集合对象abcList。注意abcList和abcInfo都只是Readonly对象.
这里,MotherList是Readonly Root Collection对象,他的元素MotherInfo是Readonly Child。
要编辑某个母亲时,载入Mother这个Editable Root对象。Mother Root对象有DaughterList(Readonly Child Collection)这么个属性,后者是由DaughterInfo(Readonly Child对象组成),当编辑某个女儿时,
载入Daughter这个Editable Root对象。
3.创建ReadOnly Root Collection对象
先添加一个新项目,File/New,然后连到数据库上"Connect to Database"
3.1. 在"Schema Objects"中, 选择Mother表.
3.2. 在"Columns"中, 选择ID, Forename, Surname and LastChanged这几个列
3.3. 右键菜单中点Create Read Only -> ReadOnly Root Collection
3.4. 在"New Object Defaults"界面,"CollectionName”栏输入MotherList,"ItemName" 栏输入MotherInfo.
3.5. 给MotherList对象添加criterion
3.5.1. 在"Csla Objects"中选择"MotherList"
3.5.2. 在"Csla Object Info"/"03. Criteria",点"Criteria Objects",见图3.5.2-1
图3.5.2-1
3.5.3.在"Criteria Collection Editor"界面, 添加一个名为"AllCollection" 的Criteria(你也可以使用其他名字).
3.5.4. 在"Misc"/"cGetOptions",设置"DataPortal", "Factory","Procedure"属性为True, ("ProcedureName" 会自动变成GetMotherList ),然后点OK
3.6. 再添加一个criterion,根据姓/名查找母亲。
3.6.1. 重复3.5.1 to 3.5.4,Name栏输入name
3.6.2. "ProcedureName"栏输入GetMotherListByName.
3.6.3. 点"Criteria Properties" .
3.6.4. 点"DbBindColumn".
3.6.5. 在"Schema Objects"界面, 选择Mother表的Forename字段
3.6.6. 然后再添加Surname.
4.创建Mother(Editable Root)
4.1. 在”Schema Objects", 选择Mother表, 右键菜单中点"Create Editable Root".
4.2. 在"09. System.Object Overrides", 把"ToString”栏的下拉菜单中选中Forename和Surname
5.创建DaughterList(Readonly Child Collection),DaughterInfo(Readonly Child)
5.1. 在“Schema Objects”, 选择"Daughter"表.
5.2. 在"Columns",选择DaughterID, Forename, Surname, MotherID, LastChanged这几个字段
5.3. 右键菜单中,点Create Readonly -> Read Only Collection -> Read Only Child Collectioin
5.4. 在"New Object Defaults",CollectionName栏输入DaughterList,ItemName中输入DaughterInfo.
5.5. Parent Type下拉菜单中选中Mother
5.6.然后要把Mother对象与这个DaughterList对象关联起来
5.6.1. "Property Name In Parent T" 输入DaughterList
6.创建Daughter(Editable Root Object)
6.1. 在"Schema Objects", 选择Mother表,右键菜单中点"Create Editable Root".
6.2. "09. System.Object Overrides", 修改"ToString"属性,选择Forename,Surname.
至此,所有BO对象都已经建好。选择代码输出路径"Output Directory",然后点"generate"生成代码