2

我刚开始玩 NPoco,但到目前为止我还没有在文档中找到我需要的东西。

例如,假设我有一个 field Created,它Instant在我的域中,但DateTimeOffset在我的数据库中设置为 UTC。有没有办法让 NPoco 转换这些类型?

4

2 回答 2

2

这很容易。下面的示例用于处理 PostgreSQL 日期时间类型,但是您可以相当容易地调整此代码。

public class Mapper : DefaultMapper
{
    public override Func<object, object> GetFromDbConverter(Type DestType, Type SourceType)
    {
        if (DestType == typeof(DateTimeOffset) || DestType == typeof(DateTimeOffset?)
            || DestType == typeof(DateTime) || DestType == typeof(DateTime?))
        {
            return x =>
            {
                if (x is NpgsqlTimeStampTZ)
                {
                    if (DestType == typeof(DateTime))
                        return (DateTime)((NpgsqlTimeStampTZ)x);
                    if (DestType == typeof(DateTime?))
                        return (DateTime?)((NpgsqlTimeStampTZ)x);
                    if (DestType == typeof(DateTimeOffset))
                        return (DateTimeOffset)((NpgsqlTimeStampTZ)x);
                    if (DestType == typeof(DateTimeOffset?))
                        return (DateTimeOffset?)((NpgsqlTimeStampTZ)x);
                }
                if (x is NpgsqlTimeStamp)
                {
                    if (DestType == typeof(DateTime))
                        return (DateTime)((NpgsqlTimeStamp)x);
                    if (DestType == typeof(DateTime?))
                        return (DateTime?)((NpgsqlTimeStamp)x);
                }
                if (x is NpgsqlDate)
                {
                    if (DestType == typeof(DateTime))
                        return (DateTime)((NpgsqlDate)x);
                    if (DestType == typeof(DateTime?))
                        return (DateTime?)((NpgsqlDate)x);
                }

                return x;
            };
        }

        return base.GetFromDbConverter(DestType, SourceType);
    }

    public override Func<object, object> GetToDbConverter(Type DestType, Type SourceType)
    {
        if (SourceType == typeof(Instance)) {
            return x => { return ((Instance)x).ToDateTimeOffset(); } // etc or something like this
        }

        return base.GetToDbConverter(DestType, SourceType);
    }
}

如果您有任何其他问题,请在 github 上的问题页面上发布问题。干杯,亚当

于 2014-01-14T03:35:20.053 回答
2

我扩展了 Schotime 演示的界面,并为几种 NodaTime 类型构建了它。太大,无法粘贴到这里,所以这里有一个 GIST

请注意,它不包括ZonedDateTime,它必须被序列化为两个不同的字段,所以我不确定 NPoco 将如何处理它。我也没有包括Period,因为除了 a 之外没有很好的对应类型varchar

警告:此代码完全未经测试。我只是将我对 Noda Time 转换的了解应用到另一个答案说明的覆盖。在您的代码中使用之前,请对其进行彻底测试。

于 2014-01-15T08:04:33.397 回答