Dapper自定义类型映射核心是实现ITypeHandler或继承TypeHandler并全局注册;需重写SetValue和Parse方法,推荐用TypeHandler保障类型安全,注册须在启动早期且唯一,Dapper自动匹配无需额外标注。
用Dapper做自定义类型映射,核心就一条路:实现 ITypeHandler 或继承更方便的 TypeHandler
必须实现两个方法:把C#值塞进数据库参数(SetValue),以及把数据库返回值转回C#对象(Parse)。推荐继承泛型抽象类 TypeHandler
public class JsonTypeHandler
{
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
}
}
注册必须在应用启动早期完成,比如 Program.cs 的最开头,或 DI 容器初始化阶段。重复注册不会报错,但建议只注册一次。
Product 类型生效):JsonTypeHandler 后,Product? 也能用Dapper 会自动匹配已注册的处理器。只要实体属性类型和注册的泛型类型一致,插入、查询都透明生效。
public Product Details { get; set; },数据库对应字段是 NVARCHAR(MAX),Dapper 就会调用你写的 JsonTypeHandler
[SqlMapper.TypeHandler]),也不用手动指定映射规则除了 JSON,以下类型也常需自定义处理:
TypeHandler,Parse 里用 Enum.Parse(value.ToString())
格式化存储:字段是 VARCHAR 存 "2025-12-10 18:00" —— SetValue 转字符串,Parse 用 DateTime.TryParseExact
SetValue 中设 parameter.DbType = DbType.Object,并确保驱动支持基本上就这些。关键不在代码多寡,而在注册时机和类型匹配是否准确。