- 接着上篇[开源]Entity Framework 6 Repository 一种实现方式
- 由于Dapper 本身就是轻量级Orm特性,这里参考Creating a Data Repository using Dapper dynamic queries in dapper 代码,来解决实体类与Expression<Func<T, bool>> predicate问题;
- 您可以通过Nuget:Install-Package MasterChief.DotNet.Core.Dapper;
- 您可以通过GitHub:MasterChief 查看具体源码以及单元测试;
- 欢迎Star,欢迎Issues;
插播一条求职
- 小弟拥有多年C#开发经验,从事过路灯,消防平台物联网平台开发,坐标上海;
- 如果贵司在招聘,烦请大佬考虑下,联系邮箱:MeetYan@outlook.com;
基于Dapper 的Repository实现
public abstract class DapperDbContextBase : IDbContext
{
#region Constructors
/// <summary>
/// 构造函数
/// </summary>
/// <param name="connectString">连接字符串</param>
protected DapperDbContextBase(string connectString)
{
ConnectString = connectString;
}
#endregion Constructors
#region Properties
/// <summary>
/// 获取 是否开启事务提交
/// </summary>
public IDbTransaction CurrentTransaction { get; private set; }
#endregion Properties
#region Fields
/// <summary>
/// 当前数据库连接
/// </summary>
public IDbConnection CurrentConnection =>
TransactionEnabled ? CurrentTransaction.Connection : CreateConnection();
/// <summary>
/// 获取 是否开启事务提交
/// </summary>
public bool TransactionEnabled => CurrentTransaction != null;
/// <summary>
/// 连接字符串
/// </summary>
protected readonly string ConnectString;
#endregion Fields
#region Methods
/// <summary>
/// 显式开启数据上下文事务
/// </summary>
/// <param name="isolationLevel">指定连接的事务锁定行为</param>
public void BeginTransaction(IsolationLevel isolationLevel = IsolationLevel.Unspecified)
{
if (!TransactionEnabled) CurrentTransaction = CreateConnection().BeginTransaction(isolationLevel);
}
/// <summary>
/// 提交当前上下文的事务更改
/// </summary>
/// <exception cref="DataAccessException">提交数据更新时发生异常:" + msg</exception>
public void Commit()
{
if (TransactionEnabled)
try
{
CurrentTransaction.Commit();
}
catch (Exception ex)
{
if (ex.InnerException?.InnerException is SqlException sqlEx)
{
var msg = DataBaseHelper.GetSqlExceptionMessage(sqlEx.Number);
throw new DataAccessException("提交数据更新时发生异常:" + msg, sqlEx);
}
throw;
}
}
/// <summary>
/// 创建记录
/// </summary>
/// <param name="entity">需要操作的实体类</param>
/// <returns>操作是否成功</returns>
public bool Create<T>(T entity)
where T : ModelBase
{
ValidateOperator.Begin().NotNull(entity, "需要新增的数据记录");
// insert single data always return 0 but the data is inserted in database successfully
//https://github.com/StackExchange/Dapper/issues/587
//List<T> data = new List<T>() { entity };
return CurrentConnection.Insert(new List<T> {entity}, CurrentTransaction) > 0;
#region 测试代码
//string sql = @"INSERT INTO [dbo].[EFSample]
// ([ID]
// ,[CreateTime]
// ,[ModifyTime]
// ,[Available]
// ,[UserName])
//VALUES
// (@ID
// ,@CreateTime
// ,@ModifyTime
// ,@Available
// ,@UserName)";
//return CurrentConnection.Execute(sql, entity) > 0;
#endregion 测试代码
}
/// <summary>
/// 创建数据库连接IDbConnection
/// </summary>
/// <returns></returns>
public abstract IDbConnection CreateConnection();
/// <sum