zoukankan      html  css  js  c++  java
  • 三、定义主从实体基类

    三、定义主从实体基类

    定义主从实体基类的原因是我希望在类的定义时,可以很明确的了解类之间的主从关系。

    3.1定义主表基类

    定义PrimaryDataEntityBase

    /// <summary>

    /// 描述主从表的主表的数据实体

    /// </summary>

    /// <typeparam name="ID">主表实体的主键ID</typeparam>

    /// <typeparam name="P">主表</typeparam>

    /// <typeparam name="F">从表</typeparam>

    public abstract class PrimaryDataEntityBase<ID, P, F> : EntityBase<P, ID>

        where P : PrimaryDataEntityBase<ID, P, F>

        where F : ForeignDataEntityBase<ID, P, F>

    {

        /// <summary>

        /// PrimaryDataEntityBase的默认构造函数

        /// </summary>

        public PrimaryDataEntityBase()

        {

     

        }

     

        /// <summary>

        /// 按table的第一行数据进行属性的初始化

        /// </summary>

        /// <param name="table"></param>

        public PrimaryDataEntityBase(System.Data.DataTable table)

            : this(table, 0)

        {

     

        }

     

        /// <summary>

        /// 按table的指定行数据进行属性的初始化

        /// </summary>

        /// <param name="table"></param>

        /// <param name="indexRow"></param>

        public PrimaryDataEntityBase(System.Data.DataTable table, int indexRow)

            : base(table, indexRow)

        {

     

        }

     

        /// <summary>

        /// 装载当前从表的详细项

        /// </summary>

        protected abstract List<F> LoadDetailedItems();

     

        /// <summary>

        /// 存放外键表的数据项目的集合

        /// </summary>

        protected List<F> items = new List<F>();

     

        /// <summary>

        /// 获取外键表数据的集合

        /// </summary>

        public List<F> DetailedItems

        {

            get

            {

                return LoadDetailedItems();

            }

        }

     

     

        /// <summary>

        /// 返回外键表的数据项目数量

        /// </summary>

        public int DetailedItemCount

        {

            get

            {

                return items.Count;

            }

        }

     

        /// <summary>

        /// 将一个外键实体加入集合

        /// </summary>

        /// <param name="item"></param>

        /// <returns></returns>

        public abstract void Add(F item);

     

        /// <summary>

        /// 从集合中移除一个外键实体

        /// </summary>

        /// <param name="item"></param>

        public abstract void Remove(F item);

     

        /// <summary>

        /// 从集合中移除一个外键实体

        /// </summary>

        /// <param name="index"></param>

        public abstract void RemoveAt(int index);

     

        /// <summary>

        /// 返回或设置匹配索引的订单详细项

        /// </summary>

        /// <param name="index"></param>

        /// <returns></returns>

        public abstract F this[int index]

        {

            set;

            get;

        }

    }

    3.2定义从表基类

    定义ForeignDataEntityBase

    /// <summary>

    /// 描述主从表的从表的数据实体

    /// </summary>

    /// <typeparam name="ID">从表实体的主键ID</typeparam>

    /// <typeparam name="P">主表</typeparam>

    /// <typeparam name="F">从表</typeparam>

    public abstract class ForeignDataEntityBase<ID, P, F> : EntityBase<F, ID>

        where P : PrimaryDataEntityBase<ID, P, F>

        where F : ForeignDataEntityBase<ID, P, F>

    {

        /// <summary>

        /// ForeignDataEntityBase的默认构造函数

        /// </summary>

        public ForeignDataEntityBase()

        {

     

        }

     

        /// <summary>

        /// 按table的第一行数据进行属性的初始化

        /// </summary>

        /// <param name="table"></param>

        public ForeignDataEntityBase(System.Data.DataTable table)

            : this(table, 0)

        {

     

        }

     

        /// <summary>

        /// 按table的指定行数据进行属性的初始化

        /// </summary>

        /// <param name="table"></param>

        /// <param name="indexRow"></param>

        public ForeignDataEntityBase(System.Data.DataTable table, int indexRow)

            : base(table, indexRow)

        {

     

        }

     

     

     

        /// <summary>

        /// 对应主键实体

        /// </summary>

        [System.ComponentModel.DataObjectField(false, false, false)]

        public P RelationOrder

        {

            set;

            get;

        }

    }

    3.3使用主从表基类

    /// <summary>

    /// 客户委托单

    /// </summary>

    [System.ComponentModel.DataObject(true)]

    public class BusinessOrder : LogisticsOrderBase<BusinessOrder, BusinessOrderItem>

    {

    }

    /// <summary>

    /// 委托单详细

    /// </summary>

    [System.ComponentModel.DataObject(true)]

    public class BusinessOrderItem : DetailedItemBase<BusinessOrder, BusinessOrderItem>

    {

    }

    现在我们的类在定义的时候,就可以非常明确的描述了主从实体的关系,并拥有了数据自动属性装载的能力。

  • 相关阅读:
    Asp.net web Api源码分析HttpServer的创建
    asp.net mvc源码分析DefaultModelBinder 集合绑定
    asp.net mvc RouteCollection的RouteExistingFiles属性理解
    Asp.net web Api源码分析HttpResponseMessage
    asp.net mvc源码分析RenderAction和RenderPartial
    AcWing 1022. 宠物小精灵之收服
    AcWing 423. 采药
    AcWing 272. 最长公共上升子序列
    算法浅谈之迭代加深
    AcWing 1023. 买书
  • 原文地址:https://www.cnblogs.com/shyleoking/p/1336743.html
Copyright © 2011-2022 走看看