Использование sql_variant с Entity Framework 4
Мой вариант использования довольно прост. У меня есть небольшая таблица с таким столбцом:
dtgTestValue sql_variant not null
Я создал модель Entity Framework (файл.edmx), и он пропустил этот столбец со словами:
Тип данных 'sql_variant' не поддерживается; столбец 'dtgTestValue' в таблице 'databaseFoo.dbo.Foobar' был исключен.
Мне нужно иметь возможность читать и записывать значения в этот конкретный столбец. Любые предложения о том, как подойти к этому довольно простому варианту использования?
2 ответа
EF 4 не имеет встроенной поддержки sql_variant
тип. В этой статье объясняется, как выполнить чтение путем сопоставления сущностей с пользовательскими запросами, захвата типа и значения по отдельности, а затем декодирования значения вручную в коде.
К сожалению, это решение не может быть адаптировано для обратной записи данных. Вы можете попробовать сопоставить вставки / обновления / удаления с хранимыми процедурами, но я не могу точно сказать, что это сработает, потому что я никогда не пробовал.
Немного опоздал на вечеринку, но все же есть еще один способ сделать это, можно создать отдельный класс таблицы LINQ для каждого варианта "типа", который вы храните в таблице базы данных. Это позволяет вам выполнять операции вставки. например;
[Table(Name = "tVariant")]
public class tVariantDouble
{
[Column(IsPrimaryKey = true, IsDbGenerated = true)]
public int variantID { get; set; }
[Column(CanBeNull = true)]
public double? myVariant { get; set; }
[Column(CanBeNull = true)]
public string name { get; set; }
[Column(CanBeNull = false)]
public int typeID { get; set; }
public tVariantDouble() { typeID = 1; }
};
[Table(Name = "tVariant")]
public class tVariantInteger
{
[Column(IsPrimaryKey = true, IsDbGenerated = true)]
public int variantID { get; set; }
[Column(CanBeNull = true)]
public int? myVariant { get; set; }
[Column(CanBeNull = true)]
public string name { get; set; }
[Column(CanBeNull = false)]
public int typeID { get; set; }
public tVariantInteger() { typeID = 2; }
};
Затем эти классы позволяют вставлять в традиционный метод LINQ-to-SQL. Я также установил typeID во время вставки в уникальное значение, что полезно для повторного выбора данных соответствующего типа с помощью оператора LINQ where.
Я бы предложил создать базовый шаблонный класс для той же таблицы, однако LINQ в лучшем случае неуклюж с наследованием и просто не будет работать.
Этот метод вызывает небольшое дублирование, но все же довольно аккуратный метод достижения этого с меньшими недостатками, чем другие предложенные методы.
Если вы хотите выбрать все данные из таблицы, независимо от типа варианта, я бы предложил использовать оператор объединения с отдельным промежуточным классом, чтобы объединить все результаты.