欢迎来到飞鸟慕鱼博客,开始您的技术之旅!
当前位置: 首页知识笔记正文

Websharp原理 ORM 3.0

终极管理员 知识笔记 106阅读

Websharp.ORM 3.0下载(包括源代码,Websharp。编辑器工具和Websharp。许可案例程序)

Websharp.ORM 3.0原理

目标

Websharp。ORM 3.0以简单、高效、实用为目标。Websharp的第一个目标。ORM 3.0就是让接口和实现尽可能简单。这样用户会很快学会ORM其次,开发者只有清楚原理才能放心使用,遇到问题可以调试,也可以把自己的想法加入到ORM中。性能一直是ORM爱好者挥之不去的痛。Websharp。ORM 3。0使用动态编译生成强类型持久化操作类,解决了性能问题。Websharp。ORM 3。0 cii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">经过一年多的积累,基本的功能比较健壮,在中小型的项目中还是比较实用的。

实现原理

目前的开发数据访问层一般有两种方式,一是采用类似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);
        }

    }


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<stringobject> 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实现如下,为了演示,这里只列出了PersistNewQueryObjects方法:


 /// <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;
        }

    }


Websharp.ORM 3.0 下载(包括源代码、Websharp.Editor工具和Websharp.Permission事例程序)
标签:
声明:无特别说明,转载请标明本文来源!