Dapper学习总结
看了《Dapper从入门到精通》后的总结
(1)Dapper 是直接扩展 IDBConnection,而且是单独一个文件,可以直接嵌入到项目中使用。
(2)通过手写sql语句,调用execute方法添加数据,返回的是影响的行数;通过实体,调用insert方法添加数据,返回的是主键值。
(3)在IDBconnection中使用事务,主要注意在执行 Insert 方法时传入Transaction,用try...catch捕获异常,并在catch块调用Rollback(否则的话会出现部分提交的情况)。
例:
public bool InsertWithTran() { using (var conn = Connection) { int _departmentid = 0, _employeeid = 0,_rnum=0; var _departmentname = new t_department { departmentname = "应用开发部ENTITY", introduce = "应用开发部主要开始公司的应用平台" }; var _employee = new t_employee {displayname = "Micro",email ="1441299@qq.com",loginname ="Micro",password = "66778899",mobile = "123456789"}; conn.Open(); var _tran=conn.BeginTransaction(); try { _departmentid=conn.Insert(_departmentname, transaction: _tran).Value; ++_rnum; _employeeid = conn.Insert(_employee, transaction: _tran).Value; ++_rnum; conn.Insert(new t_derelation { departmentid = _departmentid, employeeid = _employeeid }, transaction: _tran); ++_rnum; _tran.Commit(); } catch { _rnum = 0; _tran.Rollback(); } return _rnum > 0; } }
(4)调用存储过程,要通过DynamicParameters这个类传递参数,再把命令类型赋值为StoredProcedure,然后通过Query调用存储过程。
例:
public Tuple<string,string> ProceDemo() { int employeeid = 1; var _mobile = ""; var _dy = new DynamicParameters(); _dy.Add("employeeid", employeeid); _dy.Add("displayname", string.Empty, dbType: DbType.String, direction: ParameterDirection.Output); using (var _conn = Connection) { _conn.Open(); _mobile= _conn.Query<string>("p_Procedemo", _dy, commandType: CommandType.StoredProcedure).FirstOrDefault(); } return Tuple.Create(_mobile, _dy.Get<string>("displayname")); }
(5)基于SQL查询:使用Query<T>泛型方法;实体直接查询:使用GetList<T>泛型方法。
(6)多表查询,使用QueryMultiple(),可以返回查询中每条sql语句的数据集合。
例:
public void GetMultiEntity() { string _sql = "SELECT * FROM t_department AS a;SELECT * FROM t_employee AS a"; using (var _conn = Connection) { var _grid = _conn.QueryMultiple(_sql); var _department = _grid.Read<t_department>(); var _employee = _grid.Read<t_employee>(); } }
(7)Dapper的实体映射:
a. 属性不编辑,用[Editable(false)]这个特性标记
b. 类名到表名的映射,用[Table("tablename")]特性
c. 主键映射,如果有Id属性,默认为主键,否则要添加[Key]特性