本章来写写开发过程中Castle ActiveRecord如何处理继承关系
1、单表关联继承
用于多个对象使用同一个表的情况(父类与子类存储在一个数据表),举一个不恰当的例子
Id | Type | Name | ||
1 | user | hzd | 123456 | |
2 | admin | whx | whx1973@hotmail.com |
开发过程中经常会遇到这样设计的表 admin和user 通过type 标记出来,admin包含email属性,user包含qq属性
对于这样的情况先创建 UserInfoBase类
UserInfoBase.cs
1: [ActiveRecord(DiscriminatorColumn="type",DiscriminatorType="string",DiscriminatorValue="admin",Table="UserInfo")]
2: public class UserInfoBase:ActiveRecordBase<UserInfoBase>
3: {
4: [PrimaryKey]
5: public int Id { get; set; }
6:
7: [Property]
8: public string Name { get; set; }
9:
10: }
DiscriminatorColumn是标识的字段名字,DiscriminatorType是字段数据类型
User.cs
1: [ActiveRecord(DiscriminatorValue = "user")]
2: public class User : UserInfoBase
3: {
4: [Property]
5: public string QQ { get; set; }
6:
7: public static User Find(int id)
8: {
9: return (User)UserInfoBase.FindByPrimaryKey(typeof(User), id);
10: }
11:
12: }
Admin.cs
1: [ActiveRecord(DiscriminatorValue = "admin")]
2: public class Admin : UserInfoBase
3: {
4: [Property]
5: public string Email { get; set; }
6: }
Admin、User类通过写入不同的 DiscriminatorValue 来达到区分不同子类型的目的
2、多表关联继承
所有父子实体类各拥有一张数据库表,由基类生成主键
还是用上面的例子,略有不同,此处建立3个数据表
userinfo表
id设置为自增
admin表
AdminId 不要设置为自增
Users表
UserInfoBase.cs
1: [ActiveRecord("UserInfo"), JoinedBase]
2: public class UserInfoBase : ActiveRecordBase<UserInfoBase>
3: {
4: [PrimaryKey]
5: public int Id { get; set; }
6:
7: [Property]
8: public string Name { get; set; }
9: }
Admin.cs
1: [ActiveRecord("Admin")]
2: public class Admin:UserInfoBase
3: {
4: [JoinedKey]
5: public int AdminId { get; set; }
6:
7: [Property]
8: public string Email { get; set; }
9: }
10:
User.cs
1: [ActiveRecord("Users")]
2: public class User : UserInfoBase
3: {
4: [JoinedKey]
5: public int UserId { get; set; }
6:
7: [Property]
8: public string QQ { get; set; }
9: }
UserInfoBase添加了ActiveRecordAttribute 和 JoinedBaseAttribute 特性,子类User、Admin的属性添加了JoinedKeyAttribute,这样添加 user、admin时,会生成3个数据表 (userinfo、users、admin),userinfo表存储基类所有字段,子类表仅包含子类增加的属性和Id映射字段
需要注意的是,使用了继承以后,如果使用的时候是直接继承ActiveRecordBase<T>以获得Find,FindByProperty等方法的,需要重写这些方法,不然会继承自基类的方法。