簡體   English   中英

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上面的代碼用來工作。 現在,升級后會引發錯誤:“找不到CLR類型'NpgsqlDate'到關系類型的映射”。

如果沒有NpgsqlDate,錯誤將是:“函數fnReport(沒有時區的時間戳,沒有時區的時間戳)不存在”。

我知道推薦的方法是使用NodaTime庫。 但是,使用NodaTime庫需要進行很多代碼更改( 請參閱此問題 )。

由於我的日期時間要求非常基本,因此我可以將fnReport的參數類型更改為timestamp數據類型,並且它將起作用。

但是,我有一個具有以下屬性的實體:

[Column(TypeName = "date")]
[DataType(DataType.Date)]
public DateTime EntryDate { get; set; }

而且,對於這個實體,CRUD操作可以正常工作。 我的問題是,為什么Npgsql / EF Core能夠做到這一點,卻無法執行帶有日期類型參數的函數?

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類型的范圍(或精度)( 有關更多詳細信息,請參見PostgreSQL文檔 )。 幾乎所有常規應用程序都應該可以使用.NET DateTime

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM