如何使用 dapper 转换所有传递给 SQL 的 `DateTime` 值?

问题描述 投票:0回答:1

我正在尝试使用 Dapper 将“UTC”转换添加到我所有插入/检索的日期。现在所有日期都作为本地日期插入。经过一番研究,我找到了一种使用检索到的值来实现此目的的方法,通过实现

TypeHandler
如下:

public class DateTimeHandler : SqlMapper.TypeHandler<DateTime>
{
    public override void SetValue(IDbDataParameter parameter, DateTime value)
    {
        parameter.Value = DateTime.SpecifyKind(value, DateTimeKind.Utc);
    }

    public override DateTime Parse(object value)
    {
        return DateTime.SpecifyKind((DateTime)value, DateTimeKind.Utc);
    }
}

我通过

SqlMapper
将其添加到
Dapper.SqlMapper.AddTypeHandler

问题在于插入。看起来

SetValue
从未被调用过。该方法
SetValue
的目的是什么?如何使用 dapper 转换传递给 SQL 的所有
DateTime
值?

c# .net-core dapper
1个回答
0
投票

我测试了你的案例并意识到你可能会遗漏一些东西。

我做了这个测试:

using Dapper;
using System.Data;
using TypeHandlerSetValueTest;

SqlMapper.RemoveTypeMap(typeof(DateTime));
SqlMapper.AddTypeHandler(new DateTimeHandler());

using var connection = MySqlConnectionFactory.CreateConnection();

await connection.ExecuteAsync(
    "UPDATE `odatatest`.`Fakes` SET `InsertedAt`=@InsertedAt WHERE `Id`=@Id;",
    new
    {
        Id = "229a6bcf-a828-468c-9749-ae3d12cd8e02",
        InsertedAt = DateTime.Now,
    });

Console.WriteLine("DateTimeHandler.SetValue was initialized: " + DateTimeHandler.SetValueInitialized);

public class DateTimeHandler
    : SqlMapper.TypeHandler<DateTime>
{
    public static bool SetValueInitialized = false;

    public override void SetValue(IDbDataParameter parameter, DateTime value)
    {
        SetValueInitialized = true;
        parameter.Value = DateTime.SpecifyKind(value, DateTimeKind.Utc);
    }

    public override DateTime Parse(object value)
    {
        return DateTime.SpecifyKind((DateTime)value, DateTimeKind.Utc);
    }
}

输出是:

DateTimeHandler.SetValue was initialized: True

所以我认为你忘记放置“RemoveTypeMap”:

SqlMapper.RemoveTypeMap(typeof(DateTime));
SqlMapper.AddTypeHandler(new DateTimeHandler());

首先,您需要删除 Dapper 提供的默认值,然后添加您自己的类型处理程序。

© www.soinside.com 2019 - 2024. All rights reserved.