Использование 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 в лучшем случае неуклюж с наследованием и просто не будет работать.

Этот метод вызывает небольшое дублирование, но все же довольно аккуратный метод достижения этого с меньшими недостатками, чем другие предложенные методы.

Если вы хотите выбрать все данные из таблицы, независимо от типа варианта, я бы предложил использовать оператор объединения с отдельным промежуточным классом, чтобы объединить все результаты.

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