我正在尝试使用 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
值?
我测试了你的案例并意识到你可能会遗漏一些东西。
我做了这个测试:
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 提供的默认值,然后添加您自己的类型处理程序。