Как вы правильно обрабатываете SQL_VARIANT в Entity Framework Core?

Похоже, что поддержка была недавно добавлена ​​в Entity Framework Core в .NET Core 2.1 (preview) чтобы позволить отображение SQL_VARIANT столбцы ( https://github.com/aspnet/EntityFrameworkCore/issues/7043).

Похоже, способ сделать это с помощью нового HasConversion() метод ( https://docs.microsoft.com/en-us/ef/core/modeling/value-conversions).

Итак, чтобы отобразить мой SQL_VARIANT столбец и обрабатывать базовый тип данных как VARCHAR любой длины (я забочусь только о том, чтобы прочитать это на данный момент), я могу сделать следующее (где Value собственность здесь имеет тип object в модели):

entity.Property(e => e.Value).HasConversion(v => v.ToString(),
                                                            v => v.ToString());

Это работает, если SQL_VARIANTТип данных VARCHAR любой длины.

Тем не менее, будучи SQL_VARIANTстолбец может содержать данные других типов, таких как DATETIME ценности.

Для простоты я только указал DateTime а также string здесь, но в теории я бы, вероятно, хотел бы поддерживать типы данных, необходимые для отображения того, что может быть сохранено в SQL_VARIANT столбец, если это возможно.

Как бы я определить, какой из этих двух типов (string а также DateTime) Я хотел бы сопоставить во время выполнения? Есть ли способ сделать это?

1 ответ

Решение

Как я понимаю, путь на данный момент просто:

// where e.Value is property of type "object"
entity.Property(e => e.Value).HasColumnType("sql_variant");

И это все, не нужно никаких пользовательских конвертеров. При получении сообщения о добавлении этой функции:

Тип сопоставления теперь будет сопоставлять свойства столбцам sql_variant, если:

  • Свойство типа объекта
  • Имя типа магазина указано как sql_variant

Ваш текущий код удовлетворяет первому условию (свойство имеет тип object), но не удовлетворяет второй. Почему именно он не может вывести имя типа хранилища из свойства объекта типа - я не совсем уверен, может быть, просто потому, что Entity Framework не является специфичным для sql-сервера и поддерживает множество других баз данных, в которых object свойство может иметь различную семантику или вообще не поддерживаться, поэтому оно требует явного указания ваших намерений.

Другие вопросы по тегам