Npgsql EF 6:插入UTC日期时间值失败,尽管底层列具有timestampTz类型



我最近更新了我的应用程序:Vs 2019, EntityFramework.6.4.4, EntityFramework6.Npgsql.6.4.3和Npgsql.6.0.4

之前,一切都很顺利。更新后,我测试了不同的用例插入和读取数据库(postgreSql V13)。

在插入具有timestampTz值的简单实体时,我得到了以下异常:

Cannot write DateTime with Kind=UTC to PostgreSQL type 'timestamp without time zone', consider using 'timestamp with time zone'. Note that it's not possible to mix DateTimes with different Kinds in an array/range. See the Npgsql.EnableLegacyTimestampBehavior AppContext switch to enable legacy behavior.
下面是我使用的代码片段。实体类(POCO):
[DataContract]
[Table("TSHH_ShiftHistory", Schema = "ppc")]
public class TSHH_ShiftHistory
{
[DataMember]
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int SHH_RecordingOrder { get; set; }
//..
[DataMember]
public DateTime? SHH_Started_UTC { get; set; }
[DataMember]
public DateTime? SHH_Finished_UTC { get; set; }
// .. 
}

和写入数据库:

shiftHistory = new TSHH_ShiftHistory();
shiftHistory.SHH_Started_UTC = dateTimeStarted; // in UTC format
shiftHistory.SHH_Finished_UTC = dateTimeFinished; // in UTC format
db.TSHH_ShiftHistory.Add(shiftHistory);
int sc = db.SaveChanges();

以下是我试图获得帮助的网站:

https://www.npgsql.org/doc/release-notes/6.0.html timestamp-rationalization-and-improvementshttps://www.npgsql.org/doc/types/datetime.html#timestamps-and-timezoneshttps://www.npgsql.org/doc/api/NpgsqlTypes.NpgsqlDbType.html

Npgsql EF 6:时间戳失败时使用ExecuteSqlInterpolatedAsynchttps://github.com/npgsql/npgsql/issues/2669https://learn.microsoft.com/en-us/ef/core/modeling/value-conversions?tabs=data-annotations the-valueconverter-class

解决方案:

AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true);

当然,我在文章中读过它,但我认为没有必要往回走,当我想要关于时间戳和时区映射的新行为时,从npgsql 6.0开始。但它来了。我尝试将开关设置为true错误和。令人惊讶的是,无论设置的值如何,异常都没有引发。

至少我取消了"AppContext.SetSwitch(..);"以及插入UTC DateTime值时再次引发的异常。

我怀疑:我想知道,如果缺少"AppContext.SetSwitch(..);"语句是未初始化的行为,会导致不可预测的结果。

我很高兴,如果有人能证实我的嫌疑人,也许@Shay Rojansky?

您使用的是旧的(非核心的)EF6,为了考虑新的时间戳行为,它很可能也必须进行调整(EF Core提供程序肯定会这样做)。不幸的是,这不会发生,因为EF6不再被开发了。

我通常建议不要使用较新版本的Npgsql运行EF6;这些组合没有经过测试,可能会以各种方式失败。由于EF6被有效冻结,我建议也保持相同版本的Npgsql。

最新更新