在我的ASP.NET Core v2.1应用程序中,我具有以下内容:
// beginDate and endDate are .NET DateTime types
var beginDateParam = new NpgsqlDate(beginDate);
var endDateParam = new NpgsqlDate(endDate);
var result = await _reportDb.ReportRows
.FromSql(
"SELECT * FROM \"fnReport\"(@p0, @p1);",
new object[] { beginDateParam, endDateParam
})
.AsNoTracking().ToListAsync();
fnReport函数的参数为PostgreSQL日期类型。 在此之前,Npgsql v2.1上面的代码用来工作。现在,升级后会抛出 错误:“找不到CLR类型'NpgsqlDate'到关系类型的映射。”
没有NpgsqlDate,错误将是:“函数fnReport(无时区的时间戳,无时区的时间戳)不存在”。
我知道推荐的方法是使用NodaTime库。但是,使用NodaTime库需要进行很多代码更改(see this issue)。
因为我的日期时间要求非常基本,所以我可以将fnReport的参数类型更改为timestamp数据类型,并且可以使用。
但是,我有一个具有以下属性的实体:
[Column(TypeName = "date")]
[DataType(DataType.Date)]
public DateTime EntryDate { get; set; }
并且,对于这个实体,CRUD操作可以正常工作。我的问题是,为什么Npgsql / EF Core能够做到这一点,却无法执行带有日期类型参数的函数?
答案 0 :(得分:1)
Entity Framework Core提供程序当前未映射提供程序特定的日期/时间类型,例如NpgsqlDate
-请参见https://github.com/npgsql/Npgsql.EntityFrameworkCore.PostgreSQL/issues/467。尽管这是待办事项中的未解决问题,但这样做的机会可能不大,因为这些类型已不再有太多用途了(我们甚至考虑完全删除它们-https://github.com/npgsql/npgsql/issues/2009)。
正如您已经指出的,建议使用NodaTime类型。但是,即使您不想使用NodaTime,内置的.NET类型也可以很好地工作并且可以完全映射-使用NpgsqlDateTime
和相关类型的唯一原因是如果您要处理日期/时间值超出内置.NET类型的范围(或精度)(请参见the PostgreSQL docs for more details)。几乎所有常规应用程序都应该能够使用.NET DateTime
。