似乎没有使用Postgres SimpleCRUD调用Dapper.SqlMapper.AddTypeHandler where

时间:2017-07-27 17:01:42

标签: c# dapper npgsql dapper-simplecrud

我刚刚在使用Dapper和SimpleCRUD的系统上从Npgsql v2.2.3升级到v3.2.4.1(现在是V3.2.5) - 其他缺席的开发人员定制了后者的版本。它不是我的领域 - 我只是试图用v3支持做一些PostGIS位......

我们有一个自定义版本的DateTime,在Npgsql v3.x更严格的输入下,要求我们将NpgsqlDbType设置为NpgsqlTypes.NpgsqlDbType.Timestamp。这是通过SimpleCRUD代码中的Dapper.SqlMapper.AddTypeHandler完成的。自定义版本强制日期时间类型为UTC。

虽然这对数据库插入有预期效果,但在使用WHERE子句时似乎不会被调用 - 不确定它是在单独的情况下,还是只在一两个地方。

我可以从Postgres日志中看到,WHERE子句的参数正在调整为UTC / Local转换:参数:$ 1 ='2017-07-27 13:29:51 + 01'

通过断点,我还可以看到没有为WHERE子句输入类型处理程序,但是用于INSERT等。

问题:

我是否应该期望为WHERE子句参数调用Dapper.SqlMapper类型处理程序?

如果不是预期的行为,在使用Dapper.SimpleCRUD时如何强制NpgsqlDbType为NpgsqlTypes.NpgsqlDbType.Timestamp?

非常感谢

我已更新到Npgsql(3.2.5)和Dapper(1.50.2)的最新NuGet包。不确定Dapper.SimpleCRUD的起源,但它会在2014年开始生活,然后看起来可能会被大量定制,所以宁愿继续这样做,而不是升级并重新添加自定义。

1 个答案:

答案 0 :(得分:0)

管理以解决问题。

我添加了一个SqlMapper.ICustomQueryParameter处理程序(DateTimeUTCParameter),并将其作为ConstructDynamicParameters的一部分从SimpleCRUD中调用,而不是直接进行转换。

最后,一旦我确定了需要的东西,这是一个直接的改变。

    private static DynamicParameters ConstructDynamicParameters(Dictionary<string, object> conditionParameters)
    {
        var dynParms = new DynamicParameters();
        foreach (var kvp in conditionParameters)
        {
            if (kvp.Value is DateTimeUTC)
                dynParms.Add(string.Format("@{0}", kvp.Key), new DateTimeUTCParameter((DateTimeUTC)kvp.Value));
            else
                dynParms.Add(string.Format("@{0}", kvp.Key), kvp.Value);
        }
        return dynParms;
    }