0

我刚刚在使用 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 年开始使用,然后看起来可能被大量定制,因此宁愿继续这样做,而不是升级并重新添加定制。

4

1 回答 1

0

设法对问题进行排序。

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

最后,一旦我确定了需要什么,这是一个直截了当的改变。

    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;
    }
于 2017-07-28T12:23:53.257 回答