起因:
由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,如果有错误或者其余方法,欢迎指正。