最近这个项目采用了我积极推荐的CASTLE ACTIVERECORD作为项目的持久层,项目实施过程中遇到了一些自己早期测试没有遇到的问题,加上其他的一些零零碎碎的问题,总结一下
1、ACTIVE RECORD自带的代码生成器并不支持ORACLE。 我的做法是把数据库设置到SQL SERVER中,再生成的
2、如果ORACLE的主键是自增序列,则采用下面的写法
[PrimaryKey(PrimaryKeyType.Sequence, SequenceName
=
"
SE_KAM_FAVORITE_TYPE
"
)]
public int FAVORTYPEID
... {
}
public int FAVORTYPEID
... {
}
3、多对一,使用[BelongsTo("FORIGNKEY")] ,字符串写外键名
4、一对多,
private IList < KAMBonuse > kAMBonuseList;
/**/ /// <summary>
/// 含有的BONUSE,1:N 依照FK_KAM_BONUS
/// </summary>
[HasMany( typeof (KAMBonuse), Table = " T_KAM_BONUSE " , ColumnKey = " KAMID " , Lazy = true )]
public IList < KAMBonuse > KAMBonuseList
... {
get
...{
return this.kAMBonuseList;
}
set
...{
this.kAMBonuseList = value;
}
}
5、多对多
private
IList
<
DepartmentVO
>
departmentList;
/**/ /// <summary>
/// 集团客户与代理人,或者是营业部 N:N ,注意区分。 依照T_KAM_AGENCY_MAP。此处注意,有时候是N:1,有时候是n:n
/// </summary>
[HasAndBelongsToMany( typeof (DepartmentVO), Table = " T_KAM_AGENCY_MAP " , ColumnRef = " DEPTID " , ColumnKey = " KAMID " , Lazy = true )]
public IList < DepartmentVO > DepartmentList
... {
get
...{
return this.departmentList;
}
set
...{
this.departmentList = value;
}
}
/**/ /// <summary>
/// 集团客户与代理人,或者是营业部 N:N ,注意区分。 依照T_KAM_AGENCY_MAP。此处注意,有时候是N:1,有时候是n:n
/// </summary>
[HasAndBelongsToMany( typeof (DepartmentVO), Table = " T_KAM_AGENCY_MAP " , ColumnRef = " DEPTID " , ColumnKey = " KAMID " , Lazy = true )]
public IList < DepartmentVO > DepartmentList
... {
get
...{
return this.departmentList;
}
set
...{
this.departmentList = value;
}
}
6、需要注意的是能写成对象的千万不要写成原数据类型。比如说如果A表的Bid字段对应B表,但是没有拉键的连接。使用的时候最好把A表的Bid写成B对象。
该问题涉及NHIBERNATE的一个“脏数据管理”的问题,我准备转一篇文章来描述一下
7、如果出现一表多用,或者二表一用的情况,建议考虑NHIBERNATE里面的单表继承、多表继承机制。详见另外一篇文章
8、部门对使用CASLTE进行查询、分页、排序已经写出了完整的框架了。记得以后使用
9、VO对象写的时候要泛型继承
public
class
User: ActiveRecordBase
<
User
>
这样可以获得很多的单对象操作方法
10、采用LAZY载入后,要注意使用
using
(
new
SessionScope())
而使用上面代码的时候,又要注意
using
(
new
SessionScope(FlushAction.Never))
以避免在查询的时候自动提交修改
11、以上6、7、10点,另有详细的文章进行论述