假设有下面两个表:卡表和卡类型表

 

Table Card

字段名 字段类型 备注
CardID Number 卡主键ID
CardKindID Number 卡类型ID
StartNO Varchar2(12) 起始号码
EndNO Varchar2(12) 终止码号

 

Table CardKind

字段名 字段类型 备注
CardKindID Number 卡类型主键ID
CardKindName Varchar2(10) 卡类型名称
IsValid Char(1) 是否可用

 

我这个人比较懒,实体之类的东西,都喜欢用代码生成器生成。

下面是生成的代码片段

 

Card表

    public class Card
    {
        #region 私有变量
         /// <summary>
        /// 卡主键ID
        /// </summary>
        private decimal m_CardID;
        /// <summary>
        /// 卡类型ID
        /// </summary>
        private decimal m_CardKindID;
        /// <summary>
        /// 起始号码
         /// </summary>
        private string m_StartNO;
        /// <summary>
        /// 终止码号
         /// </summary>
        private string m_EndNO;
        #endregion
        #region 属性
         /// <summary>
        /// 卡主键ID
        /// </summary>
        public decimal CardID
        {
            get { return m_CardID; }
            set { m_CardID = value; }
        }
        /// <summary>
        /// 卡类型ID
        /// </summary>
        public decimal CardKindID
        {
            get { return m_CardKindID; }
            set { m_CardKindID = value; }
        }
        /// <summary>
        /// 起始号码
         /// </summary>
        public string StartNO
        {
            get { return m_StartNO; }
            set { m_StartNO = value; }
        }
        /// <summary>
        /// 终止码号
         /// </summary>
        public string EndNO
        {
            get { return m_EndNO; }
            set { m_EndNO = value; }
        }
        #endregion
        #region 克隆方法
         /// <summary>
        /// 克隆
         /// </summary>
        /// <returns></returns>
        public new Card Clone()
        {
            Card card = base.Clone() as Card;
            return card;
        }
        #endregion
    }
 
CardKind表
    public class CardKind
    {
        #region 私有变量
        /// <summary>
        /// 卡类型主键ID
        /// </summary>
        private decimal m_CardKindID;
        /// <summary>
        /// 卡类型名称
        /// </summary>
        private string m_CardKindName;
        /// <summary>
        /// 是否可用
        /// </summary>
        private bool m_IsValid;
        #endregion
        #region 属性
        /// <summary>
        /// 卡类型主键ID
        /// </summary>
        public decimal CardKindID
        {
            get { return m_CardKindID; }
            set { m_CardKindID = value; }
        }
        /// <summary>
        /// 卡类型名称
        /// </summary>
        public string CardKindName
        {
            get { return m_CardKindName; }
            set { m_CardKindName = value; }
        }
        /// <summary>
        /// 是否可用
        /// </summary>
        public bool IsValid
        {
            get { return m_IsValid; }
            set { m_IsValid = value; }
        }
        #endregion
        #region 克隆方法
        /// <summary>
        /// 克隆
        /// </summary>
        /// <returns></returns>
        public new CardKind Clone()
        {
            CardKind cardKind = base.Clone() as CardKind;
            return cardKind;
        }
        #endregion
    }
 
接下来,我们将数据查询出来,并保存到数据列表,数据列表的字段如下
ID 起始号 终止号 卡类型

 

相信这样的需求,大家应该是经常会遇到,现在问题就出现了,在绑定数据的时候,并没有直接可以使用的实体,注意,数据列表里面咋看是Card实体,不过Card实体中,保存的是卡类型ID,总不能把卡类型ID显示给用户看吧?这里我们要明确的输出卡类型的名称。

于是我们就悲剧了,因为目前实例化的实体根本没有用上。

所以我们又不得不重新写一个SQL语句

select cardid, startno, endno, cardkindname
  from card card
 inner join cardkind kind on card.cardkindid = kind.cardkindkindid

 

然后再绑定。如果之后还需要进一步的详细信息,我们会根据主键ID,再次查询数据库,悲剧就一直这样循环进行下去。

起始悲剧最一开始的原因就在于使用了代码生成器生成的表实体,而不是业务实体。

从显示的角度来说,CardKindID是必定和CardKindName同时出现的,我们希望一次可以读取更多的信息保存起来,因为内存不是我们考虑的范畴。

 

现在我们重新设计一下我们的实体,通过聚合的方式,重新整合两个实体类,CardKind实体类不变,Card实体类重写,最关键的地方:我们将原来CardKindID的属性删除,然后添加一个CardKind的属性,注意,克隆方法也要重写。

为了醒目直观,我这里只贴改动的代码

///// <summary>
        ///// 卡类型ID
        ///// </summary>
        //private decimal m_CardKindID;
        /// <summary>
        /// 卡类型
         /// </summary>
        private CardKind m_CardKind;
///// <summary>
        ///// 卡类型主键ID
        ///// </summary>
        //public decimal CardKindID
        //{
        //    get { return m_CardKindID; }
        //    set { m_CardKindID = value; }
        //}
        /// <summary>
        /// 卡类型
         /// </summary>
        public CardKind CardKind
        {
            get { return m_CardKind; }
            set { m_CardKind = value; }
        }
/// <summary>
        /// 克隆
         /// </summary>
        /// <returns></returns>
        public new Card Clone()
        {
            Card card = base.Clone() as Card;
            card.m_CardKind = this.CardKind.Clone();
            return card;
        }

 

这样,我们以后再使用是不是方便了很多?我们在实例化Card实体的时候,附带将CardKind信息也获取到了,再涉及到卡类型名称的地方,我们直接就可以用 card.CardKind.CardKindName的方式获取,而不用再次读取数据库。

 

好吧,文章到这里,接下来的数据列表的绑定,和双击弹出详细信息的操作,就看你的了~

posted on 2010-03-31 09:41  C.Gavin  阅读(1688)  评论(19编辑  收藏  举报