使用EFCore查询PostgreSQL时自动将DateTimeOffset转换为UTC

pinkon5k  于 2023-05-06  发布在  PostgreSQL
关注(0)|答案(1)|浏览(281)

我有一个这样的实体:

public class Datum
{
    public long Id { get; set; }
    public DateTimeOffset TimeStamp { get; set; }
}

当我想用下面的代码查询Timestamp时:

var now = DateTimeOffset.Now;
var data = await Context.Data.Where(d => d.TimeStamp > now).ToListAsync();

我得到以下错误:
无法将Offset=02:00:00的DateTimeOffset写入PostgreSQL类型“timestamp with time zone”,仅支持偏移量0(UTC)。请注意,不可能在数组/范围中将DateTimes与不同的种类混合使用。请参见Npgsql.EnableLegacyTimestampBehavior AppContext开关以启用旧行为。
当我想以这种方式添加Datum值时,也会发生同样的情况:

var now = DateTimeOffset.Now;
Context.Data.Add(new Datum()
{
    TimeStamp = now,
});

await Context.SaveChangesAsync();

我知道我可以使用DateTimeOffset.UtcNow,但我真实的的软件有点复杂,我不想每次都手动转换它。我只想让EFCore在UTC时间内自动将每个DateTimeOffset对象转换为一个对象,而无需在每次更新和查询时手动执行。

e5nszbig

e5nszbig1#

最好的方法是在get/set中执行

public class Datum
    {
        public DateTime timeUTC { get; set; }

        public long Id { get; set; }
        public DateTimeOffset TimeStamp 
        { 
            get {return timeUTC.ToLocalTime() ; }
            set {timeUTC = value.UtcDateTime ; } 
        }
    }

相关问题