关于Dapper数据库列名与属性命名不一致时基于Dapper.Contrib扩展的插入映射问题.

起因:

由EF 转为Dapper 后发现Dapper竟然没有实体属性与数据库列的映射,当数据库列名与属性名不一致时,在一些简单的插入与查询时就很难受。特别是在使用了Dapper.Contrib扩展后。

过程

于是开始网上找解决方案,很顺利的就找到了。字段添加注释的方法
https://blog.csdn.net/Zdelta/article/details/87636491在此贴上连接地址,就不赘述啦。使用后确实解决了查询的映射问题。但随着发现插入时依旧报错。网上再次搜索答案,无果…
没办法啦,只能从GitHub上下载下Dapper.Contrib的源码进行分析

思路

思路也很简单,既然查询能映射,那插入时我反过来映射下不就好啦~~
下载源码后开始调试发现在拼接插入语句时用的直接是 property.Name

 for (var i = 0; i < allPropertiesExceptKeyAndComputed.Count; i++)
            {
                var property = allPropertiesExceptKeyAndComputed[i];
                adapter.AppendColumnName(sbColumnList, property.Name);//就是这里
                if (i < allPropertiesExceptKeyAndComputed.Count - 1)
                    sbColumnList.Append(", ");
            }

通过刚才添加的列名映射我又找到了查找注释的方法

//通过PropertyInfo找到ColumnAttribute类型的属性注释
public static string GetFiledName(PropertyInfo property)
        {
            var proName = property.GetCustomAttributes(false).OfType<ColumnAttribute>().Select(t => t.Name).FirstOrDefault();
            return string.IsNullOrEmpty(proName) ? property.Name : proName;
        }

解决

最后将该Dapper.Contrib扩展中所有使用数据表列名的地方都替换为GetFiledName
函数
最后测试:

 using (IDbConnection dbConnection = Connection)
 {
      dbConnection.Insert(info); 
  } 

完全OK,如此一来像一些简单的sql 操作,也能享受像EF那样的便利啦。

注: 本人也是首次接触Dapper,如果有错误或者其余方法,欢迎指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值