一步一步实现数据库到类的自动化映射(一) 类层次的设计 类的实现
上一篇讲了很多废话,结果才讲到了工具类。实在是有点浪费大家的时间。这次我就不多说了。马上来看看设计思路:我的目标是设计完成后。这个框架要可以使用工具来根据数据库表的结构自动生成类的代码,以便减少工作量。因此,我打算把类设计成只包含表的字段的所需信息。其它保存、和查询的操作都在基类里实现(好像是废话,人人都是这样设计类的-_-!)。
因此,我要有一个Attribute类来说明类的属性对数据表之间的映射(NHibernate是用XML来说明的,我不想搞得那么麻烦、方便就好)。
以一段设计好的代码来说明一下问题。
/// <summary>
///字段 T_VarChar
///数据库里的数据类型 :VarChar ,SqlDbType :VarChar
///说明: 字段长度:60 字段小数位数0
///默认值: 是否允许为空:True
/// </summary>
public event EventHandler T_VarCharChanged;
private string mT_VarChar=null;
[SqlFieldAttribute(SqlDbType = System.Data.SqlDbType.VarChar,FieldName = "T_Name")]
public string T_VarChar
{
get{ return mT_VarChar;}
set
{
mT_VarChar=value;
if (T_VarCharChanged!=null)
T_VarCharChanged(this,new EventArgs());
}
}
以上代码是一个类里的属性。他有一个自定义属性:
[SqlFieldAttribute(SqlDbType = System.Data.SqlDbType.VarChar,FieldName = "T_Namne")]
这个东西说明了以下信息:这个类的属性在数据库中将作为VarChar类型,它所映身到表的T_Name字段。
SqlFieldAttribute 类的定义如下:
public class SqlFieldAttribute : Attribute
{
public System.Data.SqlDbType SqlDbType = SqlDbType.VarChar;
public string FieldName = "";
public bool Saveable = true;
}
子类还要重写(override) 基类的TableName方法,来获取这个类是映射哪一个表的。这个方法返回表名,如:
public override string TableName()
{
return "T_Test1";//这个类是对表T_Test1进行操作的。
}
这样表和字段的映射关系都反映出来了,那么任何一个类都可以通过反射生成Sql语句来进行操作了。并且子类中就只包括了数据表的字段。这样将业要自动生成代码也是比较容易的。
重点来了:
本来Insert和Update操作可以放在基类里实现在的。可是为了要实现“事务操作”(同时确保几个类的保存成功与失败)。还是要另外编写一个工具类来保存这些信息。
这里先不看工具类,先看看基类是怎么实现的。
using System;
using System.Data;
using YZPTool;
namespace YZPTool.Data
{
/// <summary>
/// SqlDbRecordAbstract 的摘要说明。
/// </summary>
public abstract class SqlDbRecordAbstract
{
private int m_id1 = 0;
private int m_id2 = 0;
public int ID
{
get{ return m_id1;}
}
public abstract string TableName();
/// <summary>