分享
 
 
 

搭建一套自己实用的.net架构【ORM-Dapper+DapperExtensions】

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: |||超大  

现在成熟的ORM比比皆是,这里只介绍Dapper的使用(最起码我在使用它,已经运用到项目中,小伙伴们反馈还可以)。

优点:

1、开源、轻量、小巧、上手容易。

2、支持的数据库还蛮多的,MySQL,SqlLite,Sqlserver,Oracle等一系列的数据库。

3、Dapper原理通过Emit反射IDataReader的序列队列来快速的得到和产生对象。性能貌似很牛逼的样子

缺点:

作为一款ORM太过于轻量级了,根据对象自动生成sql的功能还是空白,需要自己来扩展,

当然这也是优点, 好声音的导师们经常说某人就是张白纸……

因此针对Dapper已经有很多成熟的扩展项目了,Dapper.Rainbow、Dapper.Contrib,DapperExtensions。

我们这里介绍的是DapperExtensions。

dapper-dot-net源码:https://github.com/StackExchange/dapper-dot-net (更新频率快,项目包含了各种除了Dapper-Extensions的 扩展项目)

Dapper-Extensions 源码:https://github.com/tmsmith/Dapper-Extensions

Dapper-Extensions的优点:

1、开源

2、针对Dapper封装了常用的CRUD方法,有独立的查询语法。

3、需要映射的实体类本身0配置,无需加特性什么的。是通过独立的映射类来处理,可以设置类映射到DB的别名,字段的别名等等。

Dapper-Extensions的缺点:

1、好几年没更新了

2、不支持oracle(木有oracle的方言,已经搞定)

3、不能同时支持多种数据库(已经搞定)

4、部分代码有些bug(发现的都搞定了)

下面先简单介绍一下Dapper的基本语法。

Dapper就一个.cs文件,可以放到项目代码中直接编译,也可以直接引用DLL文件。

Dapper对DB的操作依赖于Connection,为了支持多库,咱们用 IDbConnection conn

using(IDbConnection conn =GetConnection())

{conststringquery ="select * from XO order by id desc";returnconn.Query<XOEntity>(query,null);

}

下面是带参数的语法

int xoID=666; //变量主键

using(IDbConnection conn =GetConnection())

{conststringquery ="select * from XO where Id=@MyID";returnconn.Query<XOEntity>(query,new{ MyID = xoID});

}

各种方法都重载了事务的操作,一般的数据库操作都支持。但是每次执行都需要传递sql,而且每次都要使用Using,看着不爽啊, 这……

好吧下面简单介绍下使用Dapper-Extensions的基本语法(在Dapper-Extensions 的基础上用了Repository模式,代码效果如下)。

//实体类DemoEntity entity =newDemoEntity();//根据实体主键删除this.Delete<DemoEntity>(entity);//根据主键ID删除this.Delete<DemoEntity>(1);//增加this.Insert<DemoEntity>(entity);//更新boolresult =this.Update<DemoEntity>(entity);//根据主键返回实体entity =this.GetById<DemoEntity>(1);//返回 行数this.Count<DemoEntity>(new{ ID =1});//查询所有IEnumerable<DemoEntity> list =this.GetAll<DemoEntity>();

IList<ISort> sort =newList<ISort>();

sort.Add(newSort {PRopertyName ="ID", Ascending =false});//条件查询list =this.GetList<DemoEntity>(new{ ID =1, Name ="123"}, sort);//orm 拼接条件 查询IList<IPredicate> predList =newList<IPredicate>();

predList.Add(Predicates.Field<DemoEntity>(p => p.Name,Operator.Like,"不知道%"));

predList.Add(Predicates.Field<DemoEntity>(p => p.ID, Operator.Eq,1));

IPredicateGroup predGroup=Predicates.Group(GroupOperator.And, predList.ToArray());

list=this.GetList<DemoEntity>(predGroup);//分页查询longallRowsCount =0;this.GetPageList<DemoEntity>(1,10,outallRowsCount,new{ ID =1}, sort);

在说ORM之前,还是要说一下HY.Dataaccess这个模块

这个模块是对数据访问提供的一个Helper的功能,里面包含了 各种DB的SqlHelper,分页。

DBHelper 都继承自IDBHelper.cs

usingSystem.Data.Common;usingSystem.Data;namespaceHY.DataAccess

{///<summary>///提供对数据库的基本操作,连接字符串需要在数据库配置。///</summary>publicinterfaceIDBHelper

{///<summary>///生成分页SQL语句///</summary>///<param name="pageIndex"></param>///<param name="pageSize"></param>///<param name="selectSql"></param>///<param name="sqlCount"></param>///<param name="orderBy"></param>///<returns></returns>stringGetPagingSql(intpageIndex,intpageSize,stringselectSql,stringsqlCount,stringorderBy);///<summary>///开始一个事务///</summary>///<returns></returns>DbTransaction BeginTractionand();///<summary>///开始一个事务///</summary>///<param name="connKey">数据库连接字符key</param>DbTransaction BeginTractionand(stringconnKey);///<summary>///回滚事务///</summary>///<param name="dbTransaction">要回滚的事务</param>voidRollbackTractionand(DbTransaction dbTransaction);///<summary>///结束并确认事务///</summary>///<param name="dbTransaction">要结束的事务</param>voidCommitTractionand(DbTransaction dbTransaction);#regionDataSet///<summary>///执行sql语句,ExecuteDataSet 返回DataSet///</summary>///<param name="commandText">sql语句</param>///<param name="commandType"></param>DataSet ExecuteDataSet(stringcommandText, CommandType commandType);///<summary>///执行sql语句,ExecuteDataSet 返回DataSet///</summary>///<param name="connKey">数据库连接字符key</param>///<param name="commandText">sql语句</param>///<param name="commandType"></param>DataSet ExecuteDataSet(stringconnKey,stringcommandText, CommandType commandType);///<summary>///执行sql语句,ExecuteDataSet 返回DataSet///</summary>///<param name="commandText">sql语句</param>///<param name="commandType"></param>///<param name="parameterValues">参数</param>DataSet ExecuteDataSet(stringcommandText, CommandType commandType,paramsDbParameter[] parameterValues);///<summary>///执行sql语句,ExecuteDataSet 返回DataSet///</summary>///<param name="connKey">数据库连接字符key</param>///<param name="commandText">sql语句</param>///<param name="commandType"></param>///<param name="parameterValues">参数</param>DataSet ExecuteDataSet(stringconnKey,stringcommandText, CommandType commandType,paramsDbParameter[] parameterValues);#endregion#regionExecuteNonQuery///<summary>///执行sql语句,返回影响的行数///</summary>///<param name="commandText">sql语句</param>///<param name="commandType"></param>intExecuteNonQuery(stringcommandText, CommandType commandType);///<summary>///执行sql语句,返回影响的行数///</summary>///<param name="connKey">数据库连接字符key</param>///<param name="commandText">sql语句</param>///<param name="commandType"></param>intExecuteNonQuery(stringconnKey,stringcommandText, CommandType commandType);///<summary>///执行sql语句,返回影响的行数///</summary>///<param name="trans">事务对象</param>///<param name="commandText">sql语句</param>///<param name="commandType"></param>intExecuteNonQuery(DbTransaction trans,stringcommandText, CommandType commandType);///<summary>///执行sql语句,返回影响的行数///</summary>///<param name="commandText">sql语句</param>///<param name="commandType"></param>///<param name="parameterValues">参数</param>intExecuteNonQuery(stringcommandText, CommandType commandType,paramsDbParameter[] parameterValues);///<summary>///执行sql语句,返回影响的行数///</summary>///<param name="connKey">数据库连接字符key</param>///<param name="commandText">sql语句</param>///<param name="commandType"></param>///<param name="parameterValues">参数</param>intExecuteNonQuery(stringconnKey,stringcommandText, CommandType commandType,paramsDbParameter[] parameterValues);///<summary>///执行sql语句,返回影响的行数///</summary>///<param name="trans">事务对象</param>///<param name="commandText">sql语句</param>///<param name="commandType"></param>///<param name="parameterValues">参数</param>intExecuteNonQuery(DbTransaction trans,stringcommandText, CommandType commandType,paramsDbParameter[] parameterValues);#endregion#regionIDataReader///<summary>///执行sql语句,ExecuteReader 返回IDataReader///</summary>///<param name="commandText">sql语句</param>///<param name="commandType"></param>IDataReader ExecuteReader(stringcommandText, CommandType commandType);///<summary>///执行sql语句,ExecuteReader 返回IDataReader///</summary>///<param name="commandText">sql语句</param>///<param name="commandType"></param>///<param name="parameterValues">参数</param>IDataReader ExecuteReader(stringcommandText, CommandType commandType,paramsDbParameter[] parameterValues);///<summary>///执行sql语句,ExecuteReader 返回IDataReader///</summary>///<param name="connKey">数据库连接字符key</param>///<param name="commandText">sql语句</param>///<param name="commandType"></param>IDataReader ExecuteReader(stringconnKey,stringcommandText, CommandType commandType);///<summary>///执行sql语句,ExecuteReader 返回IDataReader///</summary>///<param name="connKey">数据库连接字符key</param>///<param name="commandText">sql语句</param>///<param name="commandType"></param>///<param name="parameterValues">参数</param>IDataReader ExecuteReader(stringconnKey,stringcommandText, CommandType commandType,paramsDbParameter[] parameterValues);#endregion#regionExecuteScalar///<summary>///执行sql语句,ExecuteScalar 返回第一行第一列的值///</summary>///<param name="commandText">sql语句</param>///<param name="commandType"></param>objectExecuteScalar(stringcommandText, CommandType commandType);///<summary>///执行sql语句,ExecuteScalar 返回第一行第一列的值///</summary>///<param name="commandText">sql语句</param>///<param name="commandType"></param>///<param name="parameterValues">参数</param>objectExecuteScalar(stringcommandText, CommandType commandType,paramsDbParameter[] parameterValues);///<summary>///执行sql语句,ExecuteScalar 返回第一行第一列的值///</summary>///<param name="trans">事务</param>///<param name="commandText">sql语句</param>///<param name="commandType"></param>objectExecuteScalar(DbTransaction trans,stringcommandText, CommandType commandType);///<summary>///执行sql语句,ExecuteScalar 返回第一行第一列的值///</summary>///<param name="connKey">数据库连接字符key</param>///<param name="commandText">sql语句</param>///<param name="commandType"></param>objectExecuteScalar(stringconnKey,stringcommandText, CommandType commandType);///<summary>///执行sql语句,ExecuteScalar 返回第一行第一列的值///</summary>///<param name="connKey">数据库连接字符key</param>///<param name="commandText">sql语句</param>///<param name="commandType"></param>///<param name="parameterValues">参数</param>objectExecuteScalar(stringconnKey,stringcommandText, CommandType commandType,paramsDbParameter[] parameterValues);///<summary>///执行sql语句,ExecuteScalar 返回第一行第一列的值///</summary>///<param name="trans">事务</param>///<param name="commandText">sql语句</param>///<param name="commandType"></param>///<param name="parameterValues">参数</param>///<returns></returns>objectExecuteScalar(DbTransaction trans,stringcommandText, CommandType commandType,paramsDbParameter[] parameterValues);#endregion}

}

View Code

IDBsession.cs 对数据访问对象的定义

usingSystem;usingSystem.Data;namespaceHY.DataAccess

{///<summary>///数据库接口///</summary>publicinterfaceIDatabase

{

IDbConnection Connection {get; }

DatabaseType DatabaseType {get; }stringConnKey {get; }

}///<summary>///数据库类对象///</summary>publicclassDatabase : IDatabase

{publicIDbConnection Connection {get;privateset; }publicDatabaseType DatabaseType {get;privateset; }publicstringConnKey {get;set; }publicDatabase(IDbConnection connection)

{

Connection=connection;

}publicDatabase(DatabaseType dbType,stringconnKey)

{

DatabaseType=dbType;

ConnKey=connKey;

Connection=SqlConnectionFactory.CreateSqlConnection(dbType, connKey);

}

}///<summary>///数据连接事务的Session接口///</summary>publicinterfaceIDBSession : IDisposable

{stringConnKey {get; }

DatabaseType DatabaseType {get; }

IDbConnection Connection {get; }

IDbTransaction Transaction {get; }

IDbTransaction Begin(IsolationLevel isolation=IsolationLevel.ReadCommitted);voidCommit();voidRollback();

}

}

View Code

SqlConnectionFactory.cs 这个类是采用工厂模式创建DB连接的封装,代码如下:

usingSystem;usingSystem.Collections.Generic;usingSystem.Configuration;usingSystem.Data;namespaceHY.DataAccess

{publicenumDatabaseType

{

SqlServer,

MySql,

Oracle,

DB2

}publicclassSqlConnectionFactory

{publicstaticIDbConnection CreateSqlConnection(DatabaseType dbType,stringstrKey)

{

IDbConnection connection=null;stringstrConn =ConfigurationManager.ConnectionStrings[strKey].ConnectionString;switch(dbType)

{caseDatabaseType.SqlServer:

connection=newSystem.Data.SqlClient.SqlConnection(strConn);

break;caseDatabaseType.MySql://connection = new MySql.Data.MySqlClient.MySqlConnection(strConn);//

break;caseDatabaseType.Oracle://connection = new Oracle.DataAccess.Client.OracleConnection(strConn);connection =newSystem.Data.OracleClient.OracleConnection(strConn);

break;caseDatabaseType.DB2:

connection=newSystem.Data.OleDb.OleDbConnection(strConn);

break;

}returnconnection;

}

}

}

View Code

ORM也不是万能的,比如做大数据的批量插入什么的,还是需要SqlHelper,加上有的人就喜欢DataTable或者DataSet。

所以SqlHelper作为根基,ORM作为辅助,万无一失啊。

下面说说ORM这块的实现方式。见下截图

IDataServiceRepository.cs(提供业务层使用,里面的方法不支持传递sql,包含sql的语句最好还是放在数据层操作的好)

usingSystem.Collections.Generic;usingSystem.Data;usingDapperExtensions;usingHY.DataAccess;namespaceHY.ORM

{publicinterfaceIDataServiceRepository

{

IDBSession DBSession {get; }

T GetById<T>(dynamic primaryId)whereT :class;

IEnumerable<T> GetByIds<T>(IList<dynamic> ids)whereT :class;

IEnumerable<T> GetAll<T>()whereT :class;intCount<T>(objectpredicate,boolbuffered =false)whereT :class;//lsitIEnumerable<T> GetList<T>(objectpredicate =null, IList<ISort> sort =null,boolbuffered =false)whereT :class;

IEnumerable<T> GetPageList<T>(intpageIndex,intpageSize,outlongallRowsCount,objectpredicate =null, IList<ISort> sort =null,boolbuffered =true)whereT :class;

dynamic Insert<T>(T entity, IDbTransaction transaction =null)whereT :class;boolInsertBatch<T>(IEnumerable<T> entityList, IDbTransaction transaction =null)whereT :class;boolUpdate<T>(T entity, IDbTransaction transaction =null)whereT :class;boolUpdateBatch<T>(IEnumerable<T> entityList, IDbTransaction transaction =null)whereT :class;intDelete<T>(dynamic primaryId, IDbTransaction transaction =null)whereT :class;intDeleteList<T>(objectpredicate, IDbTransaction transaction =null)whereT :class;boolDeleteBatch<T>(IEnumerable<dynamic> ids, IDbTransaction transaction =null)whereT :class;

}

}

View Code

IDataRepository.cs(提供数据层使用,继承了上面的IDataServiceRepository,支持传入sql)

usingSystem;usingSystem.Collections.Generic;usingSystem.Data;usingDapper;usingHY.DataAccess;namespaceHY.ORM

{publicinterfaceIDataRepository : IDataServiceRepository

{

IDBSession DBSession {get; }

IEnumerable<T> Get<T>(stringsql, dynamic param =null,boolbuffered =true)whereT :class;

IEnumerable<dynamic> Get(stringsql, dynamic param =null,boolbuffered =true);

IEnumerable<TReturn> Get<TFirst, TSecond, TReturn>(stringsql, Func<TFirst, TSecond, TReturn>map,

dynamic param=null, IDbTransaction transaction =null,boolbuffered =true,stringsplitOn ="Id",int? commandTimeout =null);

IEnumerable<TReturn> Get<TFirst, TSecond,TThird, TReturn>(stringsql, Func<TFirst, TSecond,TThird, TReturn>map,

dynamic param=null, IDbTransaction transaction =null,boolbuffered =true,stringsplitOn ="Id",int? commandTimeout =null);

SqlMapper.GridReader GetMultiple(stringsql, dynamic param =null, IDbTransaction transaction =null,int? commandTimeout =null, CommandType? commandType =null);

IEnumerable<T> GetPage<T>(intpageIndex,intpageSize,outlongallRowsCount,stringsql, dynamic param =null,stringallRowsCountSql=null, dynamic allRowsCountParam =null,boolbuffered =true)whereT :class;

Int32 Execute(stringsql, dynamic param =null, IDbTransaction transaction =null);

}

}

View Code

RepositoryServiceBase.cs(IDataServiceRepository的实现类)

usingSystem.Collections.Generic;usingSystem.Data;usingSystem.Linq;usingDapper;usingDapperExtensions;usingHY.DataAccess;namespaceHY.ORM

{publicclassRepositoryServiceBase : IDataServiceRepository

{publicRepositoryServiceBase()

{

}publicRepositoryServiceBase(IDBSession dbSession)

{

DBSession=dbSession;

}publicIDBSession DBSession {get;privateset; }publicvoidSetDBSession(IDBSession dbSession)

{

DBSession=dbSession;

}///<summary>///根据Id获取实体///</summary>///<typeparam name="T"></typeparam>///<param name="primaryId"></param>///<returns></returns>publicT GetById<T>(dynamic primaryId)whereT :class{returnDBSession.Connection.Get<T>(primaryIdasobject, databaseType: DBSession.DatabaseType);

}///<summary>///根据多个Id获取多个实体///</summary>///<typeparam name="T"></typeparam>///<param name="ids"></param>///<returns></returns>publicIEnumerable<T> GetByIds<T>(IList<dynamic> ids)whereT :class{vartblName =string.Format("dbo.{0}",typeof(T).Name);varidsin =string.Join(",", ids.ToArray<dynamic>());varsql ="SELECT * FROM @table WHERE Id in (@ids)";

IEnumerable<T> dataList = DBSession.Connection.Query<T>(sql,new{ table = tblName, ids =idsin });returndataList;

}///<summary>///获取全部数据集合///</summary>///<typeparam name="T"></typeparam>///<returns></returns>publicIEnumerable<T> GetAll<T>()whereT :class{returnDBSession.Connection.GetList<T>(databaseType: DBSession.DatabaseType);

}///<summary>///统计记录总数///</summary>///<typeparam name="T"></typeparam>///<param name="predicate"></param>///<param name="buffered"></param>///<returns></returns>publicintCount<T>(objectpredicate,boolbuffered =false)whereT :class{returnDBSession.Connection.Count<T>(predicate, databaseType: DBSession.DatabaseType);

}///<summary>///查询列表数据///</summary>///<typeparam name="T"></typeparam>///<param name="predicate"></param>///<param name="sort"></param>///<param name="buffered"></param>///<returns></returns>publicIEnumerable<T> GetList<T>(objectpredicate =null, IList<ISort> sort =null,boolbuffered =false)whereT :class{returnDBSession.Connection.GetList<T>(predicate, sort,null,null, buffered, databaseType: DBSession.DatabaseType);

}///<summary>///分页///</summary>///<typeparam name="T"></typeparam>///<param name="pageIndex"></param>///<param name="pageSize"></param>///<param name="allRowsCount"></param>///<param name="predicate"></param>///<param name="sort"></param>///<param name="buffered"></param>///<returns></returns>publicIEnumerable<T> GetPageList<T>(intpageIndex,intpageSize,outlongallRowsCount,objectpredicate =null, IList<ISort> sort =null,boolbuffered =true)whereT :class{if(sort ==null)

{

sort=newList<ISort>();

}

IEnumerable<T> entityList = DBSession.Connection.GetPage<T>(predicate, sort, pageIndex, pageSize,null,null, buffered, databaseType: DBSession.DatabaseType);

allRowsCount= DBSession.Connection.Count<T>(predicate, databaseType: DBSession.DatabaseType);returnentityList;

}///<summary>///插入单条记录///</summary>///<typeparam name="T"></typeparam>///<param name="entity"></param>///<param name="transaction"></param>///<returns></returns>publicdynamic Insert<T>(T entity, IDbTransaction transaction =null)whereT :class{

dynamic result= DBSession.Connection.Insert<T>(entity, transaction, databaseType: DBSession.DatabaseType);returnresult;

}///<summary>///更新单条记录///</summary>///<typeparam name="T"></typeparam>///<param name="entity"></param>///<param name="transaction"></param>///<returns></returns>publicboolUpdate<T>(T entity, IDbTransaction transaction =null)whereT :class{boolisOk = DBSession.Connection.Update<T>(entity, transaction, databaseType: DBSession.DatabaseType);returnisOk;

}///<summary>///删除单条记录///</summary>///<typeparam name="T"></typeparam>///<param name="primaryId"></param>///<param name="transaction"></param>///<returns></returns>publicintDelete<T>(dynamic primaryId, IDbTransaction transaction =null)whereT :class{varentity = GetById<T>(primaryId);varobj = entityasT;intisOk = DBSession.Connection.Delete<T>(obj, databaseType: DBSession.DatabaseType);returnisOk;

}///<summary>///删除单条记录///</summary>///<typeparam name="T"></typeparam>///<param name="predicate"></param>///<param name="transaction"></param>///<returns></returns>publicintDeleteList<T>(objectpredicate =null, IDbTransaction transaction =null)whereT :class{returnDBSession.Connection.Delete<T>(predicate, transaction, databaseType: DBSession.DatabaseType);

}///<summary>///批量插入功能///</summary>///<typeparam name="T"></typeparam>///<param name="entityList"></param>///<param name="transaction"></param>publicboolInsertBatch<T>(IEnumerable<T> entityList, IDbTransaction transaction =null)whereT :class{boolisOk =false;foreach(variteminentityList)

{

Insert<T>(item, transaction);

}

isOk=true;returnisOk;

}///<summary>///批量更新()///</summary>///<typeparam name="T"></typeparam>///<param name="entityList"></param>///<param name="transaction"></param>///<returns></returns>publicboolUpdateBatch<T>(IEnumerable<T> entityList, IDbTransaction transaction =null)whereT :class{boolisOk =false;foreach(variteminentityList)

{

Update<T>(item, transaction);

}

isOk=true;returnisOk;

}///<summary>///批量删除///</summary>///<typeparam name="T"></typeparam>///<param name="ids"></param>///<param name="transaction"></param>///<returns></returns>publicboolDeleteBatch<T>(IEnumerable<dynamic> ids, IDbTransaction transaction =null)whereT :class{boolisOk =false;foreach(varidinids)

{

Delete<T>(id, transaction);

}

isOk=true;returnisOk;

}

}

}

View Code

RepositoryBase.cs(IDataRepository的实现类)

usingSystem;usingSystem.Collections.Generic;usingSystem.Data;usingDapper;usingDapperExtensions;usingHY.DataAccess;namespaceHY.ORM

{///<summary>///Repository基类///</summary>publicclassRepositoryBase : RepositoryServiceBase, IDataRepository

{publicRepositoryBase()

{

}publicnewvoidSetDBSession(IDBSession dbSession)

{base.SetDBSession(dbSession);

}publicRepositoryBase(IDBSession dbSession)

:base(dbSession)

{

}///<summary>///根据条件筛选出数据集合///</summary>///<typeparam name="T"></typeparam>///<param name="sql"></param>///<param name="param"></param>///<param name="buffered"></param>///<returns></returns>publicIEnumerable<T> Get<T>(stringsql, dynamic param =null,boolbuffered =true)whereT :class{returnDBSession.Connection.Query<T>(sql, paramasobject, DBSession.Transaction, buffered);

}///<summary>///根据条件筛选数据集合///</summary>///<param name="sql"></param>///<param name="param"></param>///<param name="buffered"></param>///<returns></returns>publicIEnumerable<dynamic> Get(stringsql, dynamic param =null,boolbuffered =true)

{returnDBSession.Connection.Query(sql, paramasobject, DBSession.Transaction, buffered);

}///<summary>///分页查询///</summary>///<typeparam name="T"></typeparam>///<param name="pageIndex"></param>///<param name="pageSize"></param>///<param name="allRowsCount"></param>///<param name="sql"></param>///<param name="param"></param>///<param name="allRowsCountSql"></param>///<param name="allRowsCountParam"></param>///<param name="buffered"></param>///<returns></returns>publicIEnumerable<T> GetPage<T>(intpageIndex,intpageSize,outlongallRowsCount,stringsql, dynamic param =null,stringallRowsCountSql =null, dynamic allRowsCountParam =null,boolbuffered =true)whereT :class{

IEnumerable<T> entityList = DBSession.Connection.GetPage<T>(pageIndex, pageSize,outallRowsCount, sql, paramasobject, allRowsCountSql,null,null, buffered, databaseType: DBSession.DatabaseType);returnentityList;

}///<summary>///根据表达式筛选///</summary>///<typeparam name="TFirst"></typeparam>///<typeparam name="TSecond"></typeparam>///<typeparam name="TReturn"></typeparam>///<param name="sql"></param>///<param name="map"></param>///<param name="param"></param>///<param name="transaction"></param>///<param name="buffered"></param>///<param name="splitOn"></param>///<param name="commandTimeout"></param>///<returns></returns>publicIEnumerable<TReturn> Get<TFirst, TSecond, TReturn>(stringsql, Func<TFirst, TSecond, TReturn>map,

dynamic param=null, IDbTransaction transaction =null,boolbuffered =true,stringsplitOn ="Id",int? commandTimeout =null)

{returnDBSession.Connection.Query(sql, map, paramasobject, transaction, buffered, splitOn);

}///<summary>///根据表达式筛选///</summary>///<typeparam name="TFirst"></typeparam>///<typeparam name="TSecond"></typeparam>///<typeparam name="TReturn"></typeparam>///<param name="sql"></param>///<param name="map"></param>///<param name="param"></param>///<param name="transaction"></param>///<param name="buffered"></param>///<param name="splitOn"></param>///<param name="commandTimeout"></param>///<returns></returns>publicIEnumerable<TReturn> Get<TFirst, TSecond, TThird, TReturn>(stringsql, Func<TFirst, TSecond, TThird, TReturn>map,

dynamic param=null, IDbTransaction transaction =null,boolbuffered =true,stringsplitOn ="Id",int? commandTimeout =null)

{returnDBSession.Connection.Query(sql, map, paramasobject, transaction, buffered, splitOn);

}///<summary>///获取多实体集合///</summary>///<param name="sql"></param>///<param name="param"></param>///<param name="transaction"></param>///<param name="commandTimeout"></param>///<param name="commandType"></param>///<returns></returns>publicSqlMapper.GridReader GetMultiple(stringsql, dynamic param =null, IDbTransaction transaction =null,int? commandTimeout =null, CommandType? commandType =null)

{returnDBSession.Connection.QueryMultiple(sql, paramasobject, transaction, commandTimeout, commandType);

}///<summary>///执行sql操作///</summary>///<param name="sql"></param>///<param name="param"></param>///<returns></returns>publicintExecute(stringsql, dynamic param =null, IDbTransaction transaction =null)

{returnDBSession.Connection.Execute(sql, paramasobject, transaction);

}

}

}

View Code

说起DapperExtensions修改的小地方还蛮多的,下图是一个代码比较的截图。所以一会把代码打包贴上来吧(见文章结尾)。

上述代码就可以编译成HY.ORM.DLL文件了。

下面就可以在 自己业务层继承HY.ORM中的RepositoryServiceBase类 ,数据层继承HY.ORM中的 RepositoryBase类。

通过各自的构造函数或者, SetDBSession(Helper.CreateDBSession()); 进行数据连接初始化。

接下来配置实体类和DB的映射:

publicclassDemoEntity

{publicintID {get;set; }publicstringName {get;set; }

}

[Serializable]publicclassDomoEntityORMMapper : ClassMapper<DemoEntity>{publicDomoEntityORMMapper()

{base.Table("Demo");//Map(f => f.UserID).Ignore();//设置忽略//Map(f => f.Name).Key(KeyType.Identity);//设置主键(如果主键名称不包含字母“ID”,请设置)AutoMap();

}

}

这样就可以在类中 实现 this.Get<DemoEntity>("select * from Demo where ID=@ID", new { ID = 1 }); 这样的语法了。

具体的使用方发 下图是我要介绍实现的项目截图:

其实也是三层,只是名字不一样而已。

HY.Web( UI层,MVC)

HY.Web.Iservice( 服务接口层)

HY.Web.Service(服务层,HY.Web.Iservice的实现类, 你也可以理解为业务逻辑层BLL)

HY.Web.DAO(数据访问层, 你也可以理解为DAL)

HY.Web.Entity(实体层, 目前只定义了数据实体, 如果你的系统需要给app提供数据, 那么传输的数据要精简,就需要单独定义DTO了。 )

就那用户表来做个实例吧,表结构如下:(下图是用代码生成器截图效果,可以直接修改数据库的描述信息,开发利器。需要的朋友点这里【CodeBuilder-RazorEngine】)

HY.Web.Entity在HY.Web.Entity的项目中新建Sys_UsersEntity.cs 定义实体类

View Code

HY.Web.DAO 定义基类 BaseRepository.cs (可以设置默认的DBsession,方便扩展其它东东)

View Code

定义数据访问层 Sys_UsersRepository.cs (代码里可以封装任何需要写sql 的代码)

View Code

HY.Web.IService定义接口 ISys_Usersservice.cs ,提供给UI访问。

View Code

HY.Web.Service定义BaseService.cs,(可以设置默认的DBsession,方便扩展其它东东)

View Code

定义Sys_UsersService.cs, 去实现ISys_UsersService。

View Code

HY.Web1、定义相关的Controller

2、ISys_UsersService iSys_UsersService = new Sys_UsersService(); (这块其实可以使用 IoC, 相关内容且听后续分解)

3、调用接口

View Code

下载:

HY.DataAccess

修改后的DapperExtensions:Dapperextensions.RAR

相关文章:

搭建一套自己实用的.net架构(1)【概述】

搭建一套自己实用的.net架构(2)【日志模块-log4net】

搭建一套自己实用的.net架构(3)【ORM-Dapper+DapperExtensions】

搭建一套自己实用的.net架构(4)【CodeBuilder-RazorEngine】

原文链接:http://www.cnblogs.com/hy59005271/p/4759623.html

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有