postgresql 如何在PostreSQL中存储DateTimeOffset

vecaoik1  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(2)|浏览(112)

我在使用Entity Framework从PostgreSQL数据库中检索DateTimeOffset时遇到了问题。就研究问题而言,我发现this article可以帮助我理解问题所在,但我不知道如何解决它。
我有一个API,它允许用户上传文件(主要是图像),它提取图像拍摄的日期并将其存储在数据库中。它在大多数情况下都很好用。但是,如果日期在2007年之前的3月11日到4月的某个时候(日期因年份而异),它会保存到数据库中,但当试图检索该行时,它会抛出错误:
本地dateTime参数的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; }
}

lf3rwulv

lf3rwulv1#

好的,这似乎是npgsql或npgsql. quantityFramework中DateTimeOffset的一个错误。in their issue tracker似乎记录了其他几个问题。特别是issue #542非常接近-但有不同的异常消息。
我建议你在那里创建一个新的问题,因为他们是最好的帮助进一步诊断这个问题。

nwlls2ji

nwlls2ji2#

要在PostreSQL中存储DateTimeOffset,您应该将其转换为通用时间:
public int getName();
Review issue 4176
通过使用DateTimeOffset的值转换器与EF核心6.0进行集成。最近,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>();
}

相关问题