一、前言
我们已经知道了Daper的基本使用,但是Dapper中需要使用sql语句。Dapper.Contrib的存在就是为了省写sql语句,是对Dapper的进一步封装,他直接提供了一些增删改查的方法。
二、使用
既然不需要sql语句了,那么肯定是需要一些配置的。。。就是配置实体模型。
我们数据库中有如下两张表:
那么我们的Entity为:
[Table("Players")]
public class Player
{
[Key]
public int Id { get; set; }
public string FullName { get; set; }
public decimal Salray { get; set; }
public int TeamId { get; set; }
public DateTime Birthday { get; set; }
}
主要是一些特性的介绍:
- Table:指定数据库中的table名称。
- Key:指定此列为主键(自动增长主键)。
- ExplicitKey:指定此列为主键(不自动增长类型例如guid)
- Computed:计算属性,update的时候会忽略
- Write:表示该属性是否可写入。
Key和ExplicitKey这两项都是指定列为主键的,区别是打上Key特性的列在插入时是不能指定值的,只能是数据库自动增长列,而ExplicitKey特性可以允许在插入时指定值,比如用guid为主键类型,则主键在插入时必须已经生成好。
我们简单写了一个辅助类:
public class DapperContribHelper
{
string connStr = @"server=DESKTOP-P7UORUH\SQLEXPRESS;database=TestDB;uid=heater;pwd=123456";
/// <summary>
/// 获取所有数据
/// </summary>
/// <returns>所有数据</returns>
public IEnumerable<Player> QueryAll()
{
using (IDbConnection conn = new SqlConnection(connStr))
{
return conn.GetAll<Player>();//没有主键也可以调用
}
}
/// <summary>
/// 通过主键查询数据。
/// </summary>
/// <param name="id">主键值</param>
/// <returns>查询结果</returns>
public Player QueryOne(int id)
{
using (IDbConnection conn = new SqlConnection(connStr))
{
return conn.Get<Player>(id);//并且这里的参数只能是主键
}
}
/// <summary>
/// 插入一组数据并且返回自动生成的主键的值
/// </summary>
/// <param name="player">要插入的数据</param>
/// <returns>自动生成的主键的值</returns>
public long Insert(Player player)
{
using (IDbConnection conn = new SqlConnection(connStr))
{
return conn.Insert<Player>(player);//被标记为[Key]、[Computed]、 [Write(false)]的实体属性都会被忽略。
}
}
/// <summary>
/// 批量插入数据并且返回插入数据的个数
/// </summary>
/// <param name="players">要插入的数据</param>
/// <returns>数量</returns>
public long Insert(IEnumerable<Player> players)
{
using (IDbConnection conn = new SqlConnection(connStr))
{
return conn.Insert<IEnumerable<Player>>(players);//被标记为[Key]、[Computed]、 [Write(false)]的实体属性都会被忽略。
}
}
/// <summary>
/// 根据主键修改数据
/// </summary>
/// <param name="player">修改后的数据</param>
/// <returns>是否修改成功</returns>
public bool Update(Player player)
{
using (IDbConnection conn = new SqlConnection(connStr))
{
return conn.Update<Player>(player);//根据传入的实体中主键值找到想修改的数据
}
}
/// <summary>
/// 批量修改数据
/// </summary>
/// <param name="players"></param>
/// <returns></returns>
public bool Update(IEnumerable<Player> players)
{
using (IDbConnection conn = new SqlConnection(connStr))
{
return conn.Update<IEnumerable<Player>>(players);//根据传入的实体中主键值找到想修改的数据
}
}
/// <summary>
/// 根据主键删除数据
/// </summary>
/// <param name="player"></param>
/// <returns></returns>
public bool Delete(Player player)
{
using (IDbConnection conn = new SqlConnection(connStr))
{
return conn.Update<Player>(player);//根据传入的实体中主键值找到想修改的数据
}
}
/// <summary>
/// 批量删除数据
/// </summary>
/// <param name="players"></param>
/// <returns></returns>
public bool Delete(IEnumerable<Player> players)
{
using (IDbConnection conn = new SqlConnection(connStr))
{
return conn.Update<IEnumerable<Player>>(players);//根据传入的实体中主键值找到想修改的数据
}
}
}
三、总结
我们可以发现,省了Sql语句后确实简单了很多。但是也有很多有限制的地方,例如删改查等只能通过主键来进行,也不能与其他表进行联动。