You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否实现TimeSpan到TimeOnly的隐式转换?(SqlServer+RepoDb场景)

解决RepoDb中SQL Server Time列映射到TimeOnly类型的隐式转换问题

我使用SQL Server数据库,其中有个StartTime列是Time类型,实体类里对应属性用TimeOnly类型。用RepoDb作为ORM查询数据时抛出异常,原因是SQL Server的Time列默认映射为TimeSpan,把实体属性改成TimeSpan就不会报错。

抛出的错误信息

$exception {"Unable to cast object of type 'System.TimeSpan' to type 'System.TimeOnly'."} System.InvalidCastException

现有手动转换方案

目前只能通过额外属性手动转换:

// 映射到Time数据类型
public TimeSpan TimeOnlyTest { get; set; }

public TimeOnly MyTimeOnly
{
    get { return TimeOnly.FromTimeSpan(this.TimeOnlyTest); }
    set { this.TimeOnlyTest = value.ToTimeSpan(); }
}

无需手动转换的解决方案:利用RepoDb自定义类型处理器

要实现自动隐式转换,你可以通过RepoDb的自定义类型处理器功能,注册TimeOnly与SQL Server Time类型(对应.NET TimeSpan)的转换逻辑,这样实体类直接用TimeOnly属性即可。

1. 创建自定义类型处理器

using RepoDb;
using System;

public class TimeOnlyTypeHandler : TypeHandler<TimeOnly>
{
    // 从数据库读取时,将TimeSpan转为TimeOnly
    public override TimeOnly GetValue(object value)
    {
        if (value is TimeSpan timeSpan)
        {
            return TimeOnly.FromTimeSpan(timeSpan);
        }
        return base.GetValue(value);
    }

    // 写入数据库时,将TimeOnly转为TimeSpan
    public override object SetValue(TimeOnly value)
    {
        return value.ToTimeSpan();
    }
}

2. 注册类型处理器

在应用启动阶段(比如Program.cs或Startup.cs)注册这个处理器:

// 注册TimeOnly类型的转换处理器
TypeHandlerMapper.Add<TimeOnly>(new TimeOnlyTypeHandler());

3. 实体类直接使用TimeOnly属性

现在实体类可以直接定义TimeOnly类型的属性,无需额外转换逻辑:

public class YourEntity
{
    // 直接映射SQL Server的Time列
    public TimeOnly StartTime { get; set; }
}

这样后续用RepoDb查询或写入数据时,会自动处理TimeSpan和TimeOnly之间的转换,不会再抛出类型转换异常。

内容的提问来源于stack exchange,提问作者Greg Gum

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 14:35:20