Я делаю запросы к базе данных MySQL через EF Core, чтобы получить записи. Некоторые из этих записей имеют нулевые даты
0000-00-00 00:00:00
, что вызывает знаменитое исключение MySql.Data.Types.MySqlConversionException
:
'Unable to convert MySQL date/time value to System.DateTime'
Я попытался решить эту проблему, добавив в строку подключения флаг Allow Zero Date
(всеми возможными способами) - не работает.
Затем я попытался написать перехватчик, который переопределяет метод ReaderExecuted:
class DateTimeInterceptor : Microsoft.EntityFrameworkCore.Diagnostics.DbCommandInterceptor
{
public override DbDataReader ReaderExecuted(DbCommand command, CommandExecutedEventData eventData, DbDataReader result)
{
var columns = result.GetColumnSchema();
for (int columnIndex = 0; columnIndex < columns.Count; columnIndex++)
{
if (columns[columnIndex].DataType.Name == "DateTime")
{
var columnName = columns[columnIndex].BaseColumnName;
}
}
// TODO: check the datetime column values and if needed replace them
return base.ReaderExecuted(command, eventData, result);
}
Какой тип может работать, если я читаю вручную корректно все данные модели, скопируйте их в другой считыватель и в результате передайте. Хотя это неправильно, у меня есть 11 моделей, и я не хочу вручную устанавливать считыватели для всех них - слишком глупо.
Итак, что еще я могу сделать здесь? По сути, мне нужно найти и заменить значения определенных полей перед тем, как обращаться к ним.
И вот как эти поля определены в моем классе модели:
[Column("created_at")]
public string CreatedAt { get; set; }
[Column("updated_at")]
public string UpdatedAt { get; set; }
Существует это решение, но оно тоже выглядит не очень аккуратно ...