设为首页 加入收藏

TOP

[开源]Dapper Repository 一种实现方式(一)
2019-09-17 19:08:15 】 浏览:96
Tags:开源 Dapper Repository 实现 方式
  1. 接着上篇[开源]Entity Framework 6 Repository 一种实现方式
  2. 由于Dapper 本身就是轻量级Orm特性,这里参考Creating a Data Repository using Dapper dynamic queries in dapper 代码,来解决实体类与Expression<Func<T, bool>> predicate问题;
  3. 您可以通过Nuget:Install-Package MasterChief.DotNet.Core.Dapper;
  4. 您可以通过GitHub:MasterChief 查看具体源码以及单元测试;
  5. 欢迎Star,欢迎Issues;

插播一条求职

  1. 小弟拥有多年C#开发经验,从事过路灯,消防平台物联网平台开发,坐标上海;
  1. 如果贵司在招聘,烦请大佬考虑下,联系邮箱: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
首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇串口编程之端口 下一篇asp.net core系列 50 Identity 授..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目