zoukankan      html  css  js  c++  java
  • 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等方法的,需要重写这些方法,不然会继承自基类的方法。

  • 相关阅读:
    poj 2485 Highways 最小生成树
    hdu 3415 Max Sum of MaxKsubsequence
    poj 3026 Borg Maze
    poj 2823 Sliding Window 单调队列
    poj 1258 AgriNet
    hdu 1045 Fire Net (二分图匹配)
    poj 1789 Truck History MST(最小生成树)
    fafu 1181 割点
    减肥瘦身健康秘方
    人生的问题
  • 原文地址:https://www.cnblogs.com/whx1973/p/2733746.html
Copyright © 2011-2022 走看看