如何在PostreSQL中存储DateTimeOffset

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

我在使用实体框架从 PostgreSQL 数据库检索

DateTimeOffset
时遇到问题。就研究问题而言,我发现这篇文章可以帮助我理解问题所在,但我不知道如何解决它。

我有一个 API,允许用户上传文件(主要是图像),它提取图像的拍摄日期并将其存储在数据库中。大多数时候它都工作得很好。但是,如果日期是 2007 年之前的 3 月 11 日到 4 月的某个时间(日期因年份而异),它可以很好地保存到数据库中,但在尝试检索该行时,它会抛出错误:

本地日期时间参数的 UTC 偏移量与偏移量参数不匹配。

我在 postgreSQL 中使用

Timestamp With Time Zone
类型作为
CameraDate
字段。我不知道如何让它正常工作。如果有一种方法可以在不更改数据库的情况下做到这一点,那就更好了。

示例:

2001-04-01 10:47:17-06 Works
2001-03-01 10:47:17-06 Works
2001-03-13 10:47:17-06 Doesn't work
2007-03-13 10:47:17-06 Works

这是我的代码:

Context.Files.Add(file);
Context.Entry(file).Reload();

文件类如下所示(为了简洁起见,删除了一些字段):

public class File
{
    [Column("FileId")]
    public override Guid ID { get; set; }
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int DisplayId { get; set; }
    public DateTimeOffset? CameraDate { get; set; }
}
c# entity-framework postgresql datetimeoffset
2个回答
3
投票

好吧,这似乎是 npgsql 或 npgsql.EntityFramework 中的

DateTimeOffset
的错误。 他们的问题跟踪器中似乎还记录了其他几个问题。特别是 issue #542 非常接近 - 但有不同的异常消息。

我建议您在那里创建一个新问题,因为它们是帮助进一步诊断此问题的最佳方法。


0
投票

要将 DateTimeOffset 存储在 PostreSQL 中,您应该将其转换为通用时间:

公共 DateTimeOffset ToUniversalTime();

查看问题 4176

使用 EF core 6.0,使用 DateTimeOffset 的值转换器。 我们最近在 EF 核心中引入了批量配置值转换器,我们正在利用它。 https://docs.microsoft.com/en-us/ef/core/modeling/value-conversions?tabs=data-annotations#bulk-configuring-a-value-converter

public class DateTimeOffsetConverter : ValueConverter<DateTimeOffset, DateTimeOffset>
{
    public DateTimeOffsetConverter()
        : base(
            d => d.ToUniversalTime(),
            d => d.ToUniversalTime())
    {
    }
}

在 DbContext 中覆盖

protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder)
{
    configurationBuilder
        .Properties<DateTimeOffset>()
        .HaveConversion<DateTimeOffsetConverter>();
}
© www.soinside.com 2019 - 2024. All rights reserved.