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

  • 相关阅读:
    Type Safety and Type Inference
    LEARN SWIFT
    swift 类型备份
    Swift
    associatedtype关联类型
    深入理解 Swift 派发机制
    Swift中self和Self
    Postfix Self Expression
    CGContext与上下文
    eeee
  • 原文地址:https://www.cnblogs.com/whx1973/p/2733746.html
Copyright © 2011-2022 走看看