Как вы правильно обрабатываете 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
свойство может иметь различную семантику или вообще не поддерживаться, поэтому оно требует явного указания ваших намерений.