Websharp原理 ORM 3.0
终极管理员 知识笔记 106阅读
Websharp.ORM 3.0下载(包括源代码,Websharp。编辑器工具和Websharp。许可案例程序)
Websharp.ORM 3.0原理
目标

实现原理

目前的开发数据访问层一般有两种方式,一是采用类似Petshop或者Duwarmish那样,使用编码方式实现数据访问,一种是使用ORM(以后还可能会使用LINQ)。使用硬编码方式的数据访问灵活、性能好,缺点是维护麻烦,虽然一些代码生成工具可以完成很多代码,不过不能应对变化。ORM维护性好,不过性能较弱,不灵活。
Websharp.ORM 3.0的目标是兼有两者的有点,摈弃两者的缺点,使得ORM性能高,维护又方便,实现原理是使用范型和反射生成强类型化的PersistenceManager。
首先看看Websharp.ORM 3.0的使用方法,这里演示插入一个实体对象:
public class UserBusiness
{
public void NewUser()
{
// 创建持久化管理器 PersistenceManager<User>
PersistenceManager<User> userPm =
PersistenceManagerFactory.Instance.Create<User>();
// 新建实体
User user = new User();
user.UserUID = 3;
user.Name = "xufangbo";
// 插入该实体到数据库中
userPm.PersistNew(user);
}
}
{
public void NewUser()
{
// 创建持久化管理器 PersistenceManager<User>
PersistenceManager<User> userPm =
PersistenceManagerFactory.Instance.Create<User>();
// 新建实体
User user = new User();
user.UserUID = 3;
user.Name = "xufangbo";
// 插入该实体到数据库中
userPm.PersistNew(user);
}
}
PersistenceManager<T>是一个接口,Websharp.ORM 3.0中最核心的接口,这个接口规定了数据库的对实体的操作。该接口定义如下:
/// <summary>
/// 这个接口定义持久化操作的方法
/// </summary>
/// <typeparam name="T"></typeparam>
public interface PersistenceManager<T> : IDisposable
{
/// <summary>
/// 关闭一个PersistenceManager。
/// </summary>
void Close();
/// <summary>
/// 判断一个PersistenceManager是否已经关闭了。
/// </summary>
bool IsClosed { get;}
/// <summary>
/// 数据库连接是否自动关闭,默认为真,当需要使用事务的时候需要设置为假.
/// </summary>
bool AutoClose { get;}
/// <summary>
/// 获取PersistenceManager当前所处的事务
/// </summary>
Transaction CurrentTransaction { get;}
/// <summary>
/// 获取关联实体的PersistenceManager
/// </summary>
/// <typeparam name="K"></typeparam>
/// <returns></returns>
PersistenceManager<K> GetPersistenceManager<K>();
/// <summary>
/// 指示在默认的情况下,所有的操作是否忽略缓存。如果忽略缓存,那么,有的时候会存在一些不一致的情况,除非系统被禁止了缓存的使用
/// </summary>
bool IgnoreCache { get;set;}
/// <summary>
/// 将一个新的实体对象Insert到数据库中
/// </summary>
/// <param name="entity">实体对象</param>
/// <returns></returns>
bool PersistNew(T entity);
bool PersistNew(T entity, PersistOptions options);
/// <summary>
/// 将一个实体对象更新到数据库中。
/// </summary>
/// <param name="entity">实体对象</param>
/// <returns></returns>
bool Persist(T entity);
bool Persist(T entity, string[] properties);
bool Persist(T entity, PersistOptions options);
/// <summary>
/// 根据Uid删除对象
/// </summary>
/// <param name="uid">对象的uid</param>
/// <returns>是否执行成功</returns>
bool DeleteBykey(object uid);
/// <summary>
/// 删除一个对象。
/// </summary>
/// <param name="entity">实体对象</param>
/// <returns></returns>
bool Delete(T entity);
/// <summary>
/// 删除一个对象。
/// </summary>
/// <param name="entity">实体对象</param>
/// <param name="options"></param>
/// <returns></returns>
bool Delete(T entity, PersistOptions options);
/// <summary>
/// 删除一个对象。
/// </summary>
/// <param name="entity">实体对象</param>
/// <param name="subType"></param>
/// <returns></returns>
int DeleteChild(T entity, Type subType);
/// <summary>
/// 删除一个对象。
/// </summary>
/// <param name="filter">查询条件</param>
/// <param name="qpc">参数</param>
/// <returns></returns>
int Delete(string filter, QueryParameterCollection qpc);
/// <summary>
/// 删除一个对象。
/// </summary>
/// <param name="filter">查询条件</param>
/// <param name="qpc">参数</param>
/// <param name="options"></param>
/// <returns></returns>
int Delete(string filter, QueryParameterCollection qpc, PersistOptions options);
/// <summary>
/// 如果实体在数据库中不存在则插入,反之修改
/// </summary>
/// <param name="entity">实体对象</param>
/// <returns></returns>
bool Attach(T entity);
/// <summary>
/// 根据主键查找某个对象,参数是要查找的对象,这个对象必须携带主键的信息,否则抛出异常
/// </summary>
/// <param name="entity">实体对象</param>
/// <returns></returns>
bool FindByPrimaryKey(T entity);// where T : new();
bool FindByPrimaryKey(T entity, PersistOptions options);// where T : new();
/// <summary>
/// 获取引用的对象
/// </summary>
/// <param name="entity">实体对象</param>
/// <returns></returns>
bool GetReference(T entity);
/// <summary>
/// 获取引用的对象
/// </summary>
/// <param name="entity">实体对象</param>
/// <param name="refType"></param>
/// <returns></returns>
bool GetReference(T entity, Type refType);
/// <summary>
/// 获取引用的对象
/// </summary>
/// <typeparam name="K"></typeparam>
/// <param name="entity">实体对象</param>
/// <returns></returns>
object GetReference<K>(T entity);
/// <summary>
/// 获取某个实体对象的子对象。
/// </summary>
/// <param name="entity">实体对象</param>
/// <returns></returns>
bool GetChildren(T entity);
/// <summary>
/// 获取某个实体对象的子对象。
/// </summary>
/// <param name="entity">实体对象</param>
/// <param name="childType"></param>
/// <returns></returns>
bool GetChild(T entity, Type childType);
/// <summary>
/// 获取某个实体对象的子对象。
/// </summary>
/// <typeparam name="K"></typeparam>
/// <param name="entity">实体对象</param>
/// <returns></returns>
object GetChild<K>(T entity);
/// <summary>
/// 查询对象
/// </summary>
/// <param name="filter">查询条件</param>
/// <param name="qpc">参数</param>
/// <returns></returns>
EntityList<T> QueryObjects(string filter, QueryParameterCollection qpc);
/// <summary>
/// 查询对象
/// </summary>
/// <returns></returns>
EntityList<T> QueryObjects();
/// <summary>
/// 查询对象
/// </summary>
/// <param name="cmdText"></param>
/// <param name="qpc">参数</param>
/// <returns></returns>
EntityList<T> QueryObjectsWithSql(string cmdText, QueryParameterCollection qpc);
/// <summary>
/// 查询对象
/// </summary>
/// <param name="queryRole"></param>
/// <param name="filter">查询条件</param>
/// <param name="qpc">参数</param>
/// <returns></returns>
EntityList<T> QueryObjects(QueryRole queryRole, string filter, QueryParameterCollection qpc);
/// <summary>
/// 查询对象
/// </summary>
/// <param name="queryRole"></param>
/// <param name="filter">查询条件</param>
/// <param name="qpc">参数</param>
/// <returns></returns>
DataTable QueryTable(QueryRole queryRole, string filter, QueryParameterCollection qpc);
/// <summary>
/// 查询数据到DataSet中
/// </summary>
/// <param name="filter"></param>
/// <param name="qpc"></param>
/// <param name="option"></param>
/// <param name="types"></param>
/// <returns></returns>
DataSet QueryDataset(string filter, QueryParameterCollection qpc, PersistOptions option, params Type[] types);
/// <summary>
/// 查询对象的记录数
/// </summary>
/// <param name="filter">查询条件</param>
/// <param name="qpc">参数</param>
/// <returns></returns>
int QueryObjectCount(string filter, QueryParameterCollection qpc);
/// <summary>
/// 判断实体是否存在
/// </summary>
/// <param name="entity">实体对象</param>
/// <returns></returns>
bool IsExsist(T entity);
/// <summary>
/// 查询ManyToMany对象
/// </summary>
/// <typeparam name="K"></typeparam>
/// <param name="entity">实体对象</param>
/// <param name="middleType"></param>
/// <returns></returns>
EntityList<K> QueryLinkObjects<K>(T entity, Type middleType);
/// <summary>
/// 查询ManyToMany对象
/// </summary>
/// <typeparam name="K"></typeparam>
/// <param name="entity">实体对象</param>
/// <param name="propertyInCurrentEntity"></param>
/// <param name="middleType"></param>
/// <param name="propertyInFirstRef"></param>
/// <param name="linkType"></param>
/// <param name="propertyInLinkObject"></param>
/// <returns></returns>
EntityList<K> QueryLinkObjects<K>(T entity, string propertyInCurrentEntity, Type middleType, string propertyInFirstRef, Type linkType, string propertyInLinkObject);//(T entity, Type middleType, Type linkType);
/// <summary>
/// 分页查询
/// </summary>
/// <param name="pageSize">每页大小</param>
/// <param name="pageIndex">当前页索引</param>
/// <returns></returns>
EntityList<T> QueryPageObjects(int pageSize, int pageIndex);
/// <summary>
/// 分页查询
/// </summary>
/// <param name="pageSize">每页大小</param>
/// <param name="pageIndex">当前页索引</param>
/// <param name="ascending">主键是否倒序排序</param>
/// <param name="filter">查询条件</param>
/// <param name="qpc">参数</param>
/// <returns>查询结果</returns>
EntityList<T> QueryPageObjects(int pageSize, int pageIndex, bool ascending, string filter, QueryParameterCollection qpc);
/// <summary>
/// 分页查询
/// </summary>
/// <param name="pageSize">每页大小</param>
/// <param name="pageIndex">当前页索引</param>
/// <param name="ascending">主键是否倒序排序</param>
/// <param name="filter">查询条件</param>
/// <param name="orderBy">排序</param>
/// <param name="qpc">参数</param>
/// <returns>查询结果</returns>
EntityList<T> QueryPageObjects(int pageSize, int pageIndex, bool ascending, string filter, string orderBy, QueryParameterCollection qpc);
/// <summary>
/// 分页查询
/// </summary>
/// <param name="pageSize">每页大小</param>
/// <param name="pageIndex">当前页索引</param>
/// <param name="tableName">表名</param>
/// <param name="queryFields">查询的列</param>
/// <param name="primaryKey">主键</param>
/// <param name="ascending">主键是否倒序排序</param>
/// <param name="whereClause">查询条件</param>
/// <param name="orderByCondition">排序</param>
/// <param name="qpc">参数</param>
/// <returns>查询结果</returns>
DataTable QueryPageingTable(int pageSize, int pageIndex,
string tableName, string queryFields, string primaryKey, bool ascending, string whereClause, QueryParameterCollection qpc);
/// <summary>
/// 分页查询
/// </summary>
/// <param name="pageSize">每页大小</param>
/// <param name="pageIndex">当前页索引</param>
/// <param name="tableName">表名</param>
/// <param name="queryFields">查询的列</param>
/// <param name="primaryKey">主键</param>
/// <param name="whereClause">查询条件</param>
/// <param name="orderByCondition">排序</param>
/// <param name="qpc">参数</param>
/// <returns>查询结果(DataTable)</returns>
DataTable QueryPageingTable(int pageSize, int pageIndex,
string tableName, string queryFields, string primaryKey, string whereClause, string orderByCondition, QueryParameterCollection qpc);
/// <summary>
/// 实体和DataRow的转换
/// </summary>
/// <param name="entity">实体对象</param>
/// <param name="row">DataRow</param>
void ConvertFromDataRow(T entity, DataRow row);
//void ConvertFromDataRow(T entity,DataRow row,string alias);
/// <summary>
/// 实体和DataRow的转换
/// </summary>
/// <param name="entity">实体对象</param>
/// <param name="row">DataRow</param>
void ConvertToDataRow(T entity, DataRow row);
//void ConvertToDataRow(T entity, DataRow row,string alias);
/// <summary>
/// 实体和DataRow的转换
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
string BuildKey(object id);
/// <summary>
/// 实体和DataRow的转换
/// </summary>
/// <param name="cachedTable"></param>
/// <param name="entity">实体对象</param>
/// <param name="reader"></param>
/// <param name="queryRole"></param>
void PopulateEntity(Dictionary<string, object> cachedTable, T entity, IDataReader reader, QueryRole queryRole);
/// <summary>
/// 保留ADO.Net接口
/// 执行IDbCommand.ExecuteDataSet
/// </summary>
/// <param name="cmdText">Sql脚本</param>
/// <param name="qpc">参数</param>
/// <returns>执行结果</returns>
DataSet ExecuteDataSet(string cmdText, QueryParameterCollection qpc);
/// <summary>
/// 保留ADO.Net接口
/// 执行IDbCommand.ExecuteDataSet
/// </summary>
/// <param name="ds">ds</param>
/// <param name="table">table</param>
/// <param name="cmdText">Sql脚本</param>
/// <param name="qpc">参数</param>
void ExecuteDataSet(DataSet ds, string table, string cmdText, QueryParameterCollection qpc);
/// <summary>
/// 保留ADO.Net接口
/// 执行IDbCommand.ExecuteNonQuery
/// </summary>
/// <param name="cmdText">Sql脚本</param>
/// <param name="qpc">参数</param>
/// <returns>执行结果</returns>
int ExecuteNonQuery(string cmdText, QueryParameterCollection qpc);
/// <summary>
/// 保留ADO.Net接口
/// 执行IDbCommand.ExecuteReader
/// </summary>
/// <param name="cmdText">Sql脚本</param>
/// <param name="qpc">参数</param>
/// <returns>执行结果</returns>
IDataReader ExecuteReader(string cmdText, QueryParameterCollection qpc);
/// <summary>
/// 保留ADO.Net接口
/// 执行IDbCommand.ExecuteScalar
/// </summary>
/// <param name="cmdText">Sql脚本</param>
/// <param name="qpc">参数</param>
/// <returns>执行结果</returns>
object ExecuteScalar(string cmdText, QueryParameterCollection qpc);
}
/// 这个接口定义持久化操作的方法
/// </summary>
/// <typeparam name="T"></typeparam>
public interface PersistenceManager<T> : IDisposable
{
/// <summary>
/// 关闭一个PersistenceManager。
/// </summary>
void Close();
/// <summary>
/// 判断一个PersistenceManager是否已经关闭了。
/// </summary>
bool IsClosed { get;}
/// <summary>
/// 数据库连接是否自动关闭,默认为真,当需要使用事务的时候需要设置为假.
/// </summary>
bool AutoClose { get;}
/// <summary>
/// 获取PersistenceManager当前所处的事务
/// </summary>
Transaction CurrentTransaction { get;}
/// <summary>
/// 获取关联实体的PersistenceManager
/// </summary>
/// <typeparam name="K"></typeparam>
/// <returns></returns>
PersistenceManager<K> GetPersistenceManager<K>();
/// <summary>
/// 指示在默认的情况下,所有的操作是否忽略缓存。如果忽略缓存,那么,有的时候会存在一些不一致的情况,除非系统被禁止了缓存的使用
/// </summary>
bool IgnoreCache { get;set;}
/// <summary>
/// 将一个新的实体对象Insert到数据库中
/// </summary>
/// <param name="entity">实体对象</param>
/// <returns></returns>
bool PersistNew(T entity);
bool PersistNew(T entity, PersistOptions options);
/// <summary>
/// 将一个实体对象更新到数据库中。
/// </summary>
/// <param name="entity">实体对象</param>
/// <returns></returns>
bool Persist(T entity);
bool Persist(T entity, string[] properties);
bool Persist(T entity, PersistOptions options);
/// <summary>
/// 根据Uid删除对象
/// </summary>
/// <param name="uid">对象的uid</param>
/// <returns>是否执行成功</returns>
bool DeleteBykey(object uid);
/// <summary>
/// 删除一个对象。
/// </summary>
/// <param name="entity">实体对象</param>
/// <returns></returns>
bool Delete(T entity);
/// <summary>
/// 删除一个对象。
/// </summary>
/// <param name="entity">实体对象</param>
/// <param name="options"></param>
/// <returns></returns>
bool Delete(T entity, PersistOptions options);
/// <summary>
/// 删除一个对象。
/// </summary>
/// <param name="entity">实体对象</param>
/// <param name="subType"></param>
/// <returns></returns>
int DeleteChild(T entity, Type subType);
/// <summary>
/// 删除一个对象。
/// </summary>
/// <param name="filter">查询条件</param>
/// <param name="qpc">参数</param>
/// <returns></returns>
int Delete(string filter, QueryParameterCollection qpc);
/// <summary>
/// 删除一个对象。
/// </summary>
/// <param name="filter">查询条件</param>
/// <param name="qpc">参数</param>
/// <param name="options"></param>
/// <returns></returns>
int Delete(string filter, QueryParameterCollection qpc, PersistOptions options);
/// <summary>
/// 如果实体在数据库中不存在则插入,反之修改
/// </summary>
/// <param name="entity">实体对象</param>
/// <returns></returns>
bool Attach(T entity);
/// <summary>
/// 根据主键查找某个对象,参数是要查找的对象,这个对象必须携带主键的信息,否则抛出异常
/// </summary>
/// <param name="entity">实体对象</param>
/// <returns></returns>
bool FindByPrimaryKey(T entity);// where T : new();
bool FindByPrimaryKey(T entity, PersistOptions options);// where T : new();
/// <summary>
/// 获取引用的对象
/// </summary>
/// <param name="entity">实体对象</param>
/// <returns></returns>
bool GetReference(T entity);
/// <summary>
/// 获取引用的对象
/// </summary>
/// <param name="entity">实体对象</param>
/// <param name="refType"></param>
/// <returns></returns>
bool GetReference(T entity, Type refType);
/// <summary>
/// 获取引用的对象
/// </summary>
/// <typeparam name="K"></typeparam>
/// <param name="entity">实体对象</param>
/// <returns></returns>
object GetReference<K>(T entity);
/// <summary>
/// 获取某个实体对象的子对象。
/// </summary>
/// <param name="entity">实体对象</param>
/// <returns></returns>
bool GetChildren(T entity);
/// <summary>
/// 获取某个实体对象的子对象。
/// </summary>
/// <param name="entity">实体对象</param>
/// <param name="childType"></param>
/// <returns></returns>
bool GetChild(T entity, Type childType);
/// <summary>
/// 获取某个实体对象的子对象。
/// </summary>
/// <typeparam name="K"></typeparam>
/// <param name="entity">实体对象</param>
/// <returns></returns>
object GetChild<K>(T entity);
/// <summary>
/// 查询对象
/// </summary>
/// <param name="filter">查询条件</param>
/// <param name="qpc">参数</param>
/// <returns></returns>
EntityList<T> QueryObjects(string filter, QueryParameterCollection qpc);
/// <summary>
/// 查询对象
/// </summary>
/// <returns></returns>
EntityList<T> QueryObjects();
/// <summary>
/// 查询对象
/// </summary>
/// <param name="cmdText"></param>
/// <param name="qpc">参数</param>
/// <returns></returns>
EntityList<T> QueryObjectsWithSql(string cmdText, QueryParameterCollection qpc);
/// <summary>
/// 查询对象
/// </summary>
/// <param name="queryRole"></param>
/// <param name="filter">查询条件</param>
/// <param name="qpc">参数</param>
/// <returns></returns>
EntityList<T> QueryObjects(QueryRole queryRole, string filter, QueryParameterCollection qpc);
/// <summary>
/// 查询对象
/// </summary>
/// <param name="queryRole"></param>
/// <param name="filter">查询条件</param>
/// <param name="qpc">参数</param>
/// <returns></returns>
DataTable QueryTable(QueryRole queryRole, string filter, QueryParameterCollection qpc);
/// <summary>
/// 查询数据到DataSet中
/// </summary>
/// <param name="filter"></param>
/// <param name="qpc"></param>
/// <param name="option"></param>
/// <param name="types"></param>
/// <returns></returns>
DataSet QueryDataset(string filter, QueryParameterCollection qpc, PersistOptions option, params Type[] types);
/// <summary>
/// 查询对象的记录数
/// </summary>
/// <param name="filter">查询条件</param>
/// <param name="qpc">参数</param>
/// <returns></returns>
int QueryObjectCount(string filter, QueryParameterCollection qpc);
/// <summary>
/// 判断实体是否存在
/// </summary>
/// <param name="entity">实体对象</param>
/// <returns></returns>
bool IsExsist(T entity);
/// <summary>
/// 查询ManyToMany对象
/// </summary>
/// <typeparam name="K"></typeparam>
/// <param name="entity">实体对象</param>
/// <param name="middleType"></param>
/// <returns></returns>
EntityList<K> QueryLinkObjects<K>(T entity, Type middleType);
/// <summary>
/// 查询ManyToMany对象
/// </summary>
/// <typeparam name="K"></typeparam>
/// <param name="entity">实体对象</param>
/// <param name="propertyInCurrentEntity"></param>
/// <param name="middleType"></param>
/// <param name="propertyInFirstRef"></param>
/// <param name="linkType"></param>
/// <param name="propertyInLinkObject"></param>
/// <returns></returns>
EntityList<K> QueryLinkObjects<K>(T entity, string propertyInCurrentEntity, Type middleType, string propertyInFirstRef, Type linkType, string propertyInLinkObject);//(T entity, Type middleType, Type linkType);
/// <summary>
/// 分页查询
/// </summary>
/// <param name="pageSize">每页大小</param>
/// <param name="pageIndex">当前页索引</param>
/// <returns></returns>
EntityList<T> QueryPageObjects(int pageSize, int pageIndex);
/// <summary>
/// 分页查询
/// </summary>
/// <param name="pageSize">每页大小</param>
/// <param name="pageIndex">当前页索引</param>
/// <param name="ascending">主键是否倒序排序</param>
/// <param name="filter">查询条件</param>
/// <param name="qpc">参数</param>
/// <returns>查询结果</returns>
EntityList<T> QueryPageObjects(int pageSize, int pageIndex, bool ascending, string filter, QueryParameterCollection qpc);
/// <summary>
/// 分页查询
/// </summary>
/// <param name="pageSize">每页大小</param>
/// <param name="pageIndex">当前页索引</param>
/// <param name="ascending">主键是否倒序排序</param>
/// <param name="filter">查询条件</param>
/// <param name="orderBy">排序</param>
/// <param name="qpc">参数</param>
/// <returns>查询结果</returns>
EntityList<T> QueryPageObjects(int pageSize, int pageIndex, bool ascending, string filter, string orderBy, QueryParameterCollection qpc);
/// <summary>
/// 分页查询
/// </summary>
/// <param name="pageSize">每页大小</param>
/// <param name="pageIndex">当前页索引</param>
/// <param name="tableName">表名</param>
/// <param name="queryFields">查询的列</param>
/// <param name="primaryKey">主键</param>
/// <param name="ascending">主键是否倒序排序</param>
/// <param name="whereClause">查询条件</param>
/// <param name="orderByCondition">排序</param>
/// <param name="qpc">参数</param>
/// <returns>查询结果</returns>
DataTable QueryPageingTable(int pageSize, int pageIndex,
string tableName, string queryFields, string primaryKey, bool ascending, string whereClause, QueryParameterCollection qpc);
/// <summary>
/// 分页查询
/// </summary>
/// <param name="pageSize">每页大小</param>
/// <param name="pageIndex">当前页索引</param>
/// <param name="tableName">表名</param>
/// <param name="queryFields">查询的列</param>
/// <param name="primaryKey">主键</param>
/// <param name="whereClause">查询条件</param>
/// <param name="orderByCondition">排序</param>
/// <param name="qpc">参数</param>
/// <returns>查询结果(DataTable)</returns>
DataTable QueryPageingTable(int pageSize, int pageIndex,
string tableName, string queryFields, string primaryKey, string whereClause, string orderByCondition, QueryParameterCollection qpc);
/// <summary>
/// 实体和DataRow的转换
/// </summary>
/// <param name="entity">实体对象</param>
/// <param name="row">DataRow</param>
void ConvertFromDataRow(T entity, DataRow row);
//void ConvertFromDataRow(T entity,DataRow row,string alias);
/// <summary>
/// 实体和DataRow的转换
/// </summary>
/// <param name="entity">实体对象</param>
/// <param name="row">DataRow</param>
void ConvertToDataRow(T entity, DataRow row);
//void ConvertToDataRow(T entity, DataRow row,string alias);
/// <summary>
/// 实体和DataRow的转换
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
string BuildKey(object id);
/// <summary>
/// 实体和DataRow的转换
/// </summary>
/// <param name="cachedTable"></param>
/// <param name="entity">实体对象</param>
/// <param name="reader"></param>
/// <param name="queryRole"></param>
void PopulateEntity(Dictionary<string, object> cachedTable, T entity, IDataReader reader, QueryRole queryRole);
/// <summary>
/// 保留ADO.Net接口
/// 执行IDbCommand.ExecuteDataSet
/// </summary>
/// <param name="cmdText">Sql脚本</param>
/// <param name="qpc">参数</param>
/// <returns>执行结果</returns>
DataSet ExecuteDataSet(string cmdText, QueryParameterCollection qpc);
/// <summary>
/// 保留ADO.Net接口
/// 执行IDbCommand.ExecuteDataSet
/// </summary>
/// <param name="ds">ds</param>
/// <param name="table">table</param>
/// <param name="cmdText">Sql脚本</param>
/// <param name="qpc">参数</param>
void ExecuteDataSet(DataSet ds, string table, string cmdText, QueryParameterCollection qpc);
/// <summary>
/// 保留ADO.Net接口
/// 执行IDbCommand.ExecuteNonQuery
/// </summary>
/// <param name="cmdText">Sql脚本</param>
/// <param name="qpc">参数</param>
/// <returns>执行结果</returns>
int ExecuteNonQuery(string cmdText, QueryParameterCollection qpc);
/// <summary>
/// 保留ADO.Net接口
/// 执行IDbCommand.ExecuteReader
/// </summary>
/// <param name="cmdText">Sql脚本</param>
/// <param name="qpc">参数</param>
/// <returns>执行结果</returns>
IDataReader ExecuteReader(string cmdText, QueryParameterCollection qpc);
/// <summary>
/// 保留ADO.Net接口
/// 执行IDbCommand.ExecuteScalar
/// </summary>
/// <param name="cmdText">Sql脚本</param>
/// <param name="qpc">参数</param>
/// <returns>执行结果</returns>
object ExecuteScalar(string cmdText, QueryParameterCollection qpc);
}
Websharp.ORM3.0把User实体对象保存到数据库中的过程是这样的:业务类调用PersistenceManagerFactory对象请求创建一个持久化操作类,PersistenceManagerFactory则会根据请求的实体类型调用PersistenceManagerGenerator来完成这个任务,PersistenceManagerGenerator会使用CodeDOM在内存中动态的创建一个UserPersistenceManager类,这个类实现了PersistenceManager<User >接口,专门负责User类型实体的数据访问操作。具体过程如下:
生成的这个UserPersistenceManager实现如下,为了演示,这里只列出了PersistNew和QueryObjects方法:
/// <summary>
/// 用户持久化类
/// </summary>
public class OleDBSupportedUserPersistenceManager : AbstractPersistenceManager<User>
{
/// <summary>
/// 新增用户
/// </summary>
/// <param name="user">用户</param>
/// <returns>执行是否成功</returns>
public override bool PersistNew(Websharp.Permission.Entities.User user)
{
string cmdText = null;
cmdText = "INSERT INTO Users(UserID,Name,Password) VALUES(@UserID,@Name,@Password);";
Websharp.Data.QueryParameterCollection qpc = new Websharp.Data.QueryParameterCollection();
qpc.Add("@UserID", user.UserID, DbType.String);
qpc.Add("@Name", user.Name, DbType.String);
qpc.Add("@Password", user.Password, DbType.String);
bool flag = this.Execute(CommandType.Text, cmdText, qpc);
if (flag)
{
if (!IgnoreCache)
{
CacheProxy.CacheEntity(this.BuildKey(user), user);
}
}
return flag;
}
/// <summary>
/// 查询用户
/// </summary>
/// <param name="filter">查询条件</param>
/// <param name="qpc">参数</param>
/// <returns>查询结果</returns>
public override EntityList<User> QueryObjects(string filter, QueryParameterCollection qpc)
{
EntityList<User> userEntityList = new EntityList<User>();
string cmdText = "SELECT Users.UserID,Users.Name,Users.Password FROM Users";
if ((!object.Equals(filter, null)) &&(! filter.Trim().Equals("")))
{
System.Text.StringBuilder builder = new System.Text.StringBuilder(cmdText);
builder.Append(" WHERE ");
builder.Append(filter);
cmdText = builder.ToString();
}
this.Open();
System.Data.IDataReader reader = dao.ExecuteReader(cmdText, qpc);
JumpToLabel:
if (reader.Read())
{
Websharp.Permission.Entities.User user = new Websharp.Permission.Entities.User();
if (!(reader["UserID"] is DBNull))
{
user.UserID = ((string)(reader["UserID"]));
}
if (!(reader["Name"] is DBNull))
{
user.Name = ((string)(reader["Name"]));
}
if (!(reader["Password"] is DBNull))
{
user.Password = ((string)(reader["Password"]));
}
userEntityList.Add(user);
goto JumpToLabel;
}
reader.Close();
this.Close();
return userEntityList;
}
}
/// 用户持久化类
/// </summary>
public class OleDBSupportedUserPersistenceManager : AbstractPersistenceManager<User>
{
/// <summary>
/// 新增用户
/// </summary>
/// <param name="user">用户</param>
/// <returns>执行是否成功</returns>
public override bool PersistNew(Websharp.Permission.Entities.User user)
{
string cmdText = null;
cmdText = "INSERT INTO Users(UserID,Name,Password) VALUES(@UserID,@Name,@Password);";
Websharp.Data.QueryParameterCollection qpc = new Websharp.Data.QueryParameterCollection();
qpc.Add("@UserID", user.UserID, DbType.String);
qpc.Add("@Name", user.Name, DbType.String);
qpc.Add("@Password", user.Password, DbType.String);
bool flag = this.Execute(CommandType.Text, cmdText, qpc);
if (flag)
{
if (!IgnoreCache)
{
CacheProxy.CacheEntity(this.BuildKey(user), user);
}
}
return flag;
}
/// <summary>
/// 查询用户
/// </summary>
/// <param name="filter">查询条件</param>
/// <param name="qpc">参数</param>
/// <returns>查询结果</returns>
public override EntityList<User> QueryObjects(string filter, QueryParameterCollection qpc)
{
EntityList<User> userEntityList = new EntityList<User>();
string cmdText = "SELECT Users.UserID,Users.Name,Users.Password FROM Users";
if ((!object.Equals(filter, null)) &&(! filter.Trim().Equals("")))
{
System.Text.StringBuilder builder = new System.Text.StringBuilder(cmdText);
builder.Append(" WHERE ");
builder.Append(filter);
cmdText = builder.ToString();
}
this.Open();
System.Data.IDataReader reader = dao.ExecuteReader(cmdText, qpc);
JumpToLabel:
if (reader.Read())
{
Websharp.Permission.Entities.User user = new Websharp.Permission.Entities.User();
if (!(reader["UserID"] is DBNull))
{
user.UserID = ((string)(reader["UserID"]));
}
if (!(reader["Name"] is DBNull))
{
user.Name = ((string)(reader["Name"]));
}
if (!(reader["Password"] is DBNull))
{
user.Password = ((string)(reader["Password"]));
}
userEntityList.Add(user);
goto JumpToLabel;
}
reader.Close();
this.Close();
return userEntityList;
}
}
Websharp.ORM 3.0 下载(包括源代码、Websharp.Editor工具和Websharp.Permission事例程序)

标签: