Npgsql:找不到 CLR 类型 'NpgsqlDate' 到关系类型的映射
Npgsql: No mapping to a relational type can be found for the CLR type 'NpgsqlDate'
在我的 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 上面的代码可以正常工作。现在,升级后它会抛出
错误:"No mapping to a relational type can be found for the CLR type 'NpgsqlDate'".
如果没有 NpgsqlDate,错误将是:“function fnReport(timestamp without time zone, timestamp without time zone) does not exist”。
我知道推荐的方法是使用 NodaTime 库。但是,使用 NodaTime 库需要进行大量代码更改 (see this issue)。
由于我的日期时间要求很基本,我可以将 fnReport 的参数类型更改为时间戳数据类型,并且它会起作用。
但是,我有一个具有以下内容的实体 属性:
[Column(TypeName = "date")]
[DataType(DataType.Date)]
public DateTime EntryDate { get; set; }
而且,对于这个实体,CRUD 操作工作正常。我的问题是,为什么 Npgsql/EF Core 能够做到这一点,但无法执行带有日期类型参数的函数?
提供商特定的 date/time 类型,例如 NpgsqlDate
,目前未被 Entity Framework 核心提供商映射 - 请参阅 https://github.com/npgsql/Npgsql.EntityFrameworkCore.PostgreSQL/issues/467. While this is an open issue in the backlog, there's probably not much chance it will be done, since these types don't have much use anymore (we're even considering dropping them altogether - https://github.com/npgsql/npgsql/issues/2009)。
如您所述,建议使用 NodaTime 类型。然而,即使您不想使用 NodaTime,内置的 .NET 类型也能很好地工作并且完全映射 - 使用 NpgsqlDateTime
和相关类型的唯一原因是如果您正在处理 date/time 超出内置 .NET 类型范围(或精度)的值(请参阅 the PostgreSQL docs for more details)。几乎所有常规应用程序都应该能够很好地使用 .NET DateTime
。
在我的 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 上面的代码可以正常工作。现在,升级后它会抛出 错误:"No mapping to a relational type can be found for the CLR type 'NpgsqlDate'".
如果没有 NpgsqlDate,错误将是:“function fnReport(timestamp without time zone, timestamp without time zone) does not exist”。
我知道推荐的方法是使用 NodaTime 库。但是,使用 NodaTime 库需要进行大量代码更改 (see this issue)。
由于我的日期时间要求很基本,我可以将 fnReport 的参数类型更改为时间戳数据类型,并且它会起作用。
但是,我有一个具有以下内容的实体 属性:
[Column(TypeName = "date")]
[DataType(DataType.Date)]
public DateTime EntryDate { get; set; }
而且,对于这个实体,CRUD 操作工作正常。我的问题是,为什么 Npgsql/EF Core 能够做到这一点,但无法执行带有日期类型参数的函数?
提供商特定的 date/time 类型,例如 NpgsqlDate
,目前未被 Entity Framework 核心提供商映射 - 请参阅 https://github.com/npgsql/Npgsql.EntityFrameworkCore.PostgreSQL/issues/467. While this is an open issue in the backlog, there's probably not much chance it will be done, since these types don't have much use anymore (we're even considering dropping them altogether - https://github.com/npgsql/npgsql/issues/2009)。
如您所述,建议使用 NodaTime 类型。然而,即使您不想使用 NodaTime,内置的 .NET 类型也能很好地工作并且完全映射 - 使用 NpgsqlDateTime
和相关类型的唯一原因是如果您正在处理 date/time 超出内置 .NET 类型范围(或精度)的值(请参阅 the PostgreSQL docs for more details)。几乎所有常规应用程序都应该能够很好地使用 .NET DateTime
。