当前位置: 首页 > news >正文

dapper使用Insert或update时部分字段不映射到数据库

我们在使用dapper的insert或update方法时可能会遇见一些实体中存在的字段但是,数据库中不存在的字段,这样在使用insert时就是抛出异常提示字段不存在,这个时候该怎么解决呢,下面一起看一下:

示例实体

这里我们假如 test字段在数据库中不存在

[Table("DemoTable")]
public class DemoTable:BaseEntity,ISoftDelete
{public bool isDelete { get; set; }[Key][Comment("主键")]public int id { get; set; }[Comment("姓名")][MaxLength(20)]public string name { get; set; }[Comment("身份证号")][MaxLength(18)]public string idCard { get; set; }public string test { get; set; } 
}

1.自己根据实体生成sql(相对复杂)

这里我们可以通过反射获取实体的属性,去判断忽略不需要的字段

private string GetTableName() => typeof(T).Name;
public async Task<int> CreateAsync(T entity)
{try{using IDbConnection db = GetOpenConn();var type = entity.GetType();//在这里我们略过了 id 和test 字段,这样在生成sql时就不会包含var properties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public).Where(prop => !string.IsNullOrWhiteSpace(prop.GetValue(entity))&& prop.Name != "id" && prop.Name != "test ");var columns = string.Join(", ", properties.Select(prop => prop.Name));var values = string.Join(", ", properties.Select(prop => $"@{prop.Name}"));var query = $"INSERT INTO {GetTableName()} ({columns}) VALUES ({values})";return Convert.ToInt32(await db.QueryAsync(query, entity));}catch (Exception e){throw new Exception(e.Message);}
}

2.使用特性跳过属性

使用特性的方式就非常简单粗暴啦,引用using Dapper.Contrib.Extensions;

在不需要的映射的属性上添加[Write(false)]

using Dapper.Contrib.Extensions;[Write(false)]public int id { get; set; }[Write(false)]public string test { get; set; } 

然后直接调用Insert方法即可

public async Task<int> CreateAsync(T entity)
{try{using IDbConnection db = GetOpenConn();return db.Insert<T>(entity);}catch (Exception e){throw new Exception(e.Message);}
}

相关文章:

  • 什么是Symbol?在实际开发中怎么用?
  • 软件设计师——信息安全(一)
  • java.lang.ClassNotFoundException:javax.xml.bind.DatatypeConverter 报错解决
  • 数据库原理与应用——简答题练习(数据管理技术发展、数据库主要特征、数据模型、关系模型、实体性之间的关系、DBMS的功能、相关术语解释、数据库系统)
  • arcgis api for js 中使用API的代理页面(跨越配置)
  • 【docker 】Dockerfile指令学习
  • 爬虫工作量由小到大的思维转变---<第三章 搞多大的盘>
  • c++程序设计定义一个 (图书)类,在该类定义中包括
  • 【数据结构】树状数组总结
  • 推荐一款好用的包含表格识别的OCR网站
  • Debian系统安装OpenVPN
  • javaWebssh汽车销售管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计
  • Flink系列之:窗口关联
  • HTML面试题
  • 【Spark面试】Spark面试题答案
  • 【css3】浏览器内核及其兼容性
  • 【个人向】《HTTP图解》阅后小结
  • Docker 笔记(2):Dockerfile
  • Java的Interrupt与线程中断
  • PAT A1050
  • Promise初体验
  • 对超线程几个不同角度的解释
  • 工作中总结前端开发流程--vue项目
  • 机器学习学习笔记一
  • 前端设计模式
  • 前端自动化解决方案
  • 前嗅ForeSpider采集配置界面介绍
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 使用API自动生成工具优化前端工作流
  • 跳前端坑前,先看看这个!!
  • 微信支付JSAPI,实测!终极方案
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (佳作)两轮平衡小车(原理图、PCB、程序源码、BOM等)
  • (一)WLAN定义和基本架构转
  • (转)Linux整合apache和tomcat构建Web服务器
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .Net - 类的介绍
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET CORE Aws S3 使用
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • @AutoConfigurationPackage的使用
  • @serverendpoint注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • [AIGC] Redis基础命令集详细介绍
  • [AutoSar]BSW_Com07 CAN报文接收流程的函数调用
  • [BZOJ 1032][JSOI2007]祖码Zuma(区间Dp)