Npgsql: невозможно найти сопоставление с реляционным типом для типа CLR 'NpgsqlDate' - PullRequest
0 голосов
/ 30 декабря 2018

В моем приложении 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 ошибка будет: «function fnReport (отметка времени без часового пояса»)., метка времени без часового пояса) не существует ".

Я знаю, что рекомендуется использовать библиотеку NodaTime.Но использование библиотеки NodaTime требует значительных изменений кода ( см. Эту проблему ).

Поскольку мои требования к datetime довольно просты, я могу изменить типы аргументов fnReport на тип данных timestamp, иэто будет работать.

Однако у меня есть объект со следующим свойством:

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

И для этого объекта операции CRUD работают нормально.У меня вопрос, почему Npgsql / EF Core может это сделать, но не может выполнить функцию с параметрами типа даты?

1 Ответ

0 голосов
/ 30 декабря 2018

Специфичные для провайдера типы даты / времени, такие как NpgsqlDate, в настоящее время не сопоставлены провайдером Entity Framework Core - см. https://github.com/npgsql/Npgsql.EntityFrameworkCore.PostgreSQL/issues/467. Хотя это открытая проблема в бэклоге, вероятно, нетмного шансов, что это будет сделано, так как эти типы больше не имеют большого применения (мы даже рассматриваем их полное удаление - https://github.com/npgsql/npgsql/issues/2009).

Как вы заметили, рекомендуется использовать типы NodaTime. Однако, даже если вы не хотите использовать NodaTime, встроенные типы .NET работают хорошо и полностью отображаются - единственная причина для использования NpgsqlDateTime и связанных типов - это если вы имеете дело со значениями даты / времени, которыевыходят за пределы диапазона (или точности) встроенных типов .NET (подробности см. в документации PostgreSQL ). Почти все обычные приложения должны уметь отлично использовать .NET DateTime.

...