假设有下面两个表:卡表和卡类型表
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的方式获取,而不用再次读取数据库。
好吧,文章到这里,接下来的数据列表的绑定,和双击弹出详细信息的操作,就看你的了~