Castle ActiveRecord学习实践(5)继承

本章来写写开发过程中Castle ActiveRecord如何处理继承关系

1、单表关联继承

用于多个对象使用同一个表的情况(父类与子类存储在一个数据表),举一个不恰当的例子

Id Type Name Email QQ
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表

IHP9@5F}]}FZ$$68AN4WO{T

id设置为自增

admin表

]JG)ZXIV5{`3XGNVA}(6XQV

AdminId 不要设置为自增

Users表

GDQMDXU19EIAZ[]63P7C(NO

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等方法的,需要重写这些方法,不然会继承自基类的方法。

原文地址:https://www.cnblogs.com/whx1973/p/2733746.html