0

0

Dapper如何自定义类型映射 Dapper Custom Type Handlers教程

煙雲

煙雲

发布时间:2026-01-10 10:31:02

|

501人浏览过

|

来源于php中文网

原创

Dapper自定义类型映射核心是实现ITypeHandler或继承TypeHandler并全局注册;需重写SetValue和Parse方法,推荐用TypeHandler保障类型安全,注册须在启动早期且唯一,Dapper自动匹配无需额外标注。

dapper如何自定义类型映射 dapper custom type handlers教程

用Dapper做自定义类型映射,核心就一条路:实现 ITypeHandler 或继承更方便的 TypeHandler,再注册到全局处理器缓存里。不复杂但容易忽略细节。

写一个TypeHandler类

必须实现两个方法:把C#值塞进数据库参数(SetValue),以及把数据库返回值转回C#对象(Parse)。推荐继承泛型抽象类 TypeHandler,它自带类型安全,避免运行时类型转换错误。

  • System.Text.Json 处理 JSON 字段示例:

public class JsonTypeHandler : SqlMapper.TypeHandler
{
  private readonly JsonSerializerOptions _options = new() { PropertyNameCaseInsensitive = true };

  public override void SetValue(IDbDataParameter parameter, T value)
  {
    parameter.DbType = DbType.String;
    parameter.Value = JsonSerializer.Serialize(value, _options) ?? string.Empty;
  }

  public override T Parse(object value)
  {
    if (value == null || value is DBNull) return default;
    return JsonSerializer.Deserialize(value.ToString(), _options) ?? default;
  }
}

注册处理器

注册必须在应用启动早期完成,比如 Program.cs 的最开头,或 DI 容器初始化阶段。重复注册不会报错,但建议只注册一次。

Keeva AI
Keeva AI

AI一键生成数字人营销视频

下载
  • 全局注册(对所有 Product 类型生效):
    SqlMapper.AddTypeHandler(new JsonTypeHandler());
  • 检查是否注册成功:
    bool has = SqlMapper.HasTypeHandler(typeof(Product)); // true
  • 支持可空类型自动适配 —— 注册 JsonTypeHandler 后,Product? 也能用

实际使用时无需额外标注

Dapper 会自动匹配已注册的处理器。只要实体属性类型和注册的泛型类型一致,插入、查询都透明生效。

  • 例如实体中有 public Product Details { get; set; },数据库对应字段是 NVARCHAR(MAX),Dapper 就会调用你写的 JsonTypeHandler
  • 不需要加特性(如 [SqlMapper.TypeHandler]),也不用手动指定映射规则
  • 若同时存在多个同类型处理器,后注册的会覆盖前面的

常见类型适配场景

除了 JSON,以下类型也常需自定义处理:

  • 枚举存字符串:数据库存 "Active",不是 1 —— 写 TypeHandlerParse 里用 Enum.Parse(value.ToString())
  • DateTime 格式化存储:字段是 VARCHAR 存 "2025-12-10 18:00" —— SetValue 转字符串,ParseDateTime.TryParseExact
  • PostgreSQL 的 JSONB:只需在 SetValue 中设 parameter.DbType = DbType.Object,并确保驱动支持

基本上就这些。关键不在代码多寡,而在注册时机和类型匹配是否准确。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

408

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

532

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

309

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

74

2025.09.10

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

315

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

231

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

435

2024.03.01

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

727

2023.08.22

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

25

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.2万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号