您的位置:首页 > 其它

基于Grove的.NET应用程序开发提示2

2005-07-13 11:23 381 查看
基于Grove的.NET应用程序开发提示

前一篇中讲到对于数据库表的主键如果是非自动增长型的使用GROVE如何处理的例子,原文见http://blog.csdn.net/greystar/archive/2005/07/13/423644.aspx

7/13/423644.aspx.
在使用GROVE时,对于实体的一些常见操作。无非是每个实体类都配一个数据访问类

namespace JadeSoft.Logistics.SystemInfo
{
using System;
using Grove.ORM;
using JadeSoft.Common;
[DataTable("sDepartment")]
public class Department {
Guid _OID;
String _DeptID="";

//这里给OID属性指明是数据库对应的主键列OID列,同时OID列是非自动增长的。
[KeyField("OID",KeyType=UniqueIDType.OtherDefinition)]
public Guid OID
{
get{return this._OID;}
set
{
this._OID=value;
}
}
[DataField("DeptID")]
public String DeptID
{
get{
return this._DeptID;
}
set{
this._DeptID=value;
}
}

}
}

数据访问类基本框架如下:
//对部门数据访问处理

using System;
using System.Data;
using JadeSoft.Logistics.SystemInfo;
using Grove.ORM;
namespace JadeSoft.Logistics.SystemInfo.DAL
{
/// <summary>
/// DeptDataAccess 的摘要说明。
/// </summary>
public class DeptDataAccess
{

public DeptDataAccess()
{
//
// TODO: 在此处添加构造函数逻辑
//
}

/// <summary>
/// 新增一条部门记录
/// </summary>
/// <param name="dept">部门对象</param>
public void AddNewDept(Department dept)
{
if(null==dept)
{
throw new ArgumentNullException("实体对象不能为空!");
}
try
{
ObjectOperator objOpt=new ObjectOperator();
objOpt.Insert(dept);
}
catch
{
throw ;
}
}

//其他数据处理如DELETE等。略
}
}

关键是在于。数据库里有很多表。每个表都对应这样一个数据访问类,是不是有点不切实际。能不能通过一个公共的接口来实现所有的实体对

象的数据访问规则。有这样一个想法,赶快想将此想法变为实现。(在坐公车回家的路上,我一直在想这样一个问题。我从公司回到家差不多

要一个半小时,回家后吃完晚饭,几分钟时间吧,就打开电脑开始写代码了).

这里我们可以定义一个接口,让所有的实体类都实现此接口。
using System;

namespace JadeSoft.Common
{
/// <summary>
/// 定义实体类接口,系统中所有的实体类都应符合此标准
/// </summary>
public interface IEntity
{
//主键我都设为GUID类型的,
System.Guid OID
{
get;
set;
}

/// <summary>
/// 该属性标识该数据实体对象是否已被持久化过。
/// </summary>
EntityStatus IsPersist{get; set;}

/// <summary>
/// 该方法提供一个验证该实体对象内的数据是否有效的途径。每一个数据实体类都需要实现该方法。但是在该方法中只进

行对自身数据的有效性检查。
/// 涉及到多个实例的有效性验证建议不归在此方法中,应放在相应的控制类中进行。
/// </summary>
/// <returns>校验结果是否有效</returns>
bool Validate();
}

/// <summary>
/// 标示一个数据实体的当前状态
/// </summary>
public enum EntityStatus
{
/// <summary>
/// 表明不存在于数据库表中
/// </summary>
New=0,

/// <summary>
/// 被标记为需要UPdate到数据库中
/// </summary>
Update=1,

/// <summary>
/// 被标记为需要从数据库中Delete
/// </summary>
Delete=2,

/// <summary>
/// 表明和数据库中相比是没有变化的
/// </summary>
Persisted=3

}
}

然后我让实体类实现此接口
namespace JadeSoft.Logistics.SystemInfo
{
using System;
using Grove.ORM;
using JadeSoft.Common;
[DataTable("sDepartment")]
public class Department:JadeSoft.Common.IEntity
{
Guid _OID;
String _DeptID="";

[KeyField("OID",KeyType=UniqueIDType.OtherDefinition)]
public Guid OID
{
get{return this._OID;}
set
{
this._OID=value;
this._EntityStatus=EntityStatus.Update; //数据更改,需要保存到数据库中
}
}
[DataField("DeptID",Size=30)]
public String DeptID
{
get{
return this._DeptID;
}
set{
this._DeptID=value;
this._EntityStatus=EntityStatus.Update; //数据更改,需要保存到数据库中
}
}

#region IEntity 成员

public bool Validate()
{
if(this._DeptID.Length==0)
{
return false;
}
if(this._DeptName.Length==0)
{
return false;
}
return true;

}
//对象状态
private EntityStatus _EntityStatus=EntityStatus.New;
public JadeSoft.Common.EntityStatus IsPersist
{
get
{
// TODO: 添加 Department.IsPersist getter 实现
return _EntityStatus;
}
set
{
_EntityStatus=value;
}
}

#endregion

}
}

下面我可以写一个公共的数据库访问类,用于对所有的实体的数据访问目的.

using System;
using Grove.ORM;
using System.Data;
using JadeSoft.Common;
using System.Collections;
namespace JadeSoft.Logistics.SystemInfo.DAL
{
/// <summary>
/// 对一般实体对象的通用处理。增删改查等功能
/// </summary>
public class CommonDataAccess
{
ObjectOperator objOpt=new ObjectOperator();
public CommonDataAccess()
{
//
// TODO: 在此处添加构造函数逻辑
//
}

public void UpdateObject(IEntity entity)
{
if(entity==null)
{
throw new ArgumentNullException("实体对象不能为空!");
}
try
{
//对象是新生成的
if(entity.IsPersist==EntityStatus.New)
{
objOpt.Insert(entity);
entity.IsPersist=EntityStatus.Persisted; //更新完成后对象状态
}
else if(entity.IsPersist==EntityStatus.Update)
{
objOpt.Update(entity);
}
else if(entity.IsPersist==EntityStatus.Delete)
{
objOpt.Remove(entity);
}
}
catch(Exception ex)
{
throw ex;
}
}

public IEntity Retrieve(Type type,Guid OID)
{
return (IEntity)objOpt.Retrieve(type,OID);
}

/// <summary>
/// 根据所需类型查询出所有的对象。
/// </summary>
/// <param name="type">所需类型,业务实体</param>
/// <returns>对象数组</returns>
public ArrayList Retrieves(Type type)
{
ObjectQuery oquery=new ObjectQuery(type);
return objOpt.GetObjectSet(oquery);
}
/// <summary>
/// 根据所需类型查询出所有的对象。
/// </summary>
/// <param name="type">所需类型,业务实体</param>
/// <param name="FilterExpression">过滤表达式,和SQL中的WHERE是一样。如this.UserName='greystar'</param>
/// <returns>对象数组</returns>
public ArrayList Retrieves(Type type,string FilterExpression)
{
ObjectQuery oquery=new ObjectQuery(type,FilterExpression);
return objOpt.GetObjectSet(oquery);
}
/// <summary>
/// 根据所需类型查询出所有的对象。
/// </summary>
/// <param name="type">所需类型,业务实体</param>
/// <param name="FilterExpression">过滤表达式,和SQL中的WHERE是一样。如this.UserName='greystar'</param>
/// <returns>数据集对象</returns><
public DataSet RetrieveDataSet(Type type,string FilterExpression)
{
ObjectQuery oquery=new ObjectQuery(type,FilterExpression);
return (DataSet)objOpt.GetObjectSource(oquery);
}

/// <summary>
/// 根据所需类型查询出所有的对象。
/// </summary>
/// <param name="type">所需类型,业务实体</param>
/// <returns>数据集对象</returns>
public DataSet RetrieveDataSet(Type type)
{
ObjectQuery oquery=new ObjectQuery(type);
return (DataSet)objOpt.GetObjectSource(oquery);
}
}
}

接下面我们可以试一下。这样的处理能行吗。当ObjectOperator对象在数据操作时能识别出IENTITY对象的原始类型吗。
我们可以用代码来测试一下。
CommonDataAccess cda=new CommonDataAccess();
Department dpt=new Department();
dpt.OID=System.Guid.NewGuid();
dpt.DeptID="greystar";

cda.UpdateObject(dpt);//保存对象

代码运行一切正常。数据库操作成功。这样的话,我只要让每个实体类都实现IENTITY接口。就不用再写任何数据访问代码了。
这个主意是不是很好。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐