Измените значение одного поля перед его использованием с EF Core - PullRequest
0 голосов
/ 02 мая 2020

Я делаю запросы к базе данных 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; }

Существует это решение, но оно тоже выглядит не очень аккуратно ...

...