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

基于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接口。就不用再写任何数据访问代码了。
这个主意是不是很好。    


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值