Dapper 默认不支持 TimeSpan 类型直接映射,因其内置类型处理器未覆盖 TimeSpan;需手动注册 ITypeHandler 实现 SQL Server 的 time 类型双向转换,或在 SQLite 中用 TEXT/INTEGER 替代并手动解析。
Dapper 默认不支持 TimeSpan 类型的直接映射,尤其在使用 SQLite 或某些数据库提供程序时(如 Microsoft.Data.Sqlite),TimeSpan 会被明确排除在自动转换列表之外。
SQL Server 的 time 类型逻辑上对应 .NET 的 TimeSpan,但 Dapper 的内置类型处理器只覆盖常见基础类型(int、string、DateTime 等),而未包含 TimeSpan。官方文档与源码注释中已明确说明:它不能处理 TimeSpan、DateTimeOffset、Guid 等类型,需手动注册处理器。
在 SQL Server 场景下,可借助自定义 ITypeHandler 实现双向转换:
TimeSpan 转为 TimeSpan.ToString("g") 或直接传给 SqlParameter 并设 SqlDbType.Time
SqlDataReader.GetTimeSpan() 或 GetValue() 后解析字符串/TimeSpanSqlMapper.AddTypeHandler(typeof(TimeSpan), new TimeSpanHandler())
SQLite 没有原生 time 类型,通常用 TEXT(如 "14:30:00")或 INTEGER(秒数)存储时间跨度。此时建议:
ParseExact 或 TimeSpan.FromSeconds 手动转换DynamicParameters 显式控制参数类型
TimeSpanHandler 并全局注册对简单场景,可绕过映射限制:
Query 或匿名类型,再手动转 TimeSpan
TimeSpan.TotalSeconds 当 int 存,读取后再构造 TimeSpan
DateOnly/TimeOnly(.NET 6+)替代部分 TimeSpan 语义,Dapper 支持更好基本上就这些。关键不是“能不能”,而是“要不要自己搭桥”——Dapper 把控制权留给你,也正因如此,它轻、快、不越界。