2012-06-26 3 views
4

Мой случай использования довольно прост. У меня есть небольшой столик с колонкой, как это:Использование sql_variant с Entity Framework 4

dtgTestValue sql_variant not null 

Я создал модель Entity Framework (EDMX-файл), и он пропустил эту колонка поговорки:

типа данных «sql_variant» не поддерживается; столбец «dtgTestValue» в таблице «databaseFoo.dbo.Foobar» исключен.

Мне нужно уметь читать и записывать значения в этот столбец. Любые предложения о том, как подойти к этому довольно простому варианту использования?

+1

Это [статья] (http://www.codeproject.com/Articles/137509/Reading-sql_variant-in-Entity-Framework), которая может помочь. –

+0

@ TheJonasPersson: нашел эту статью во время моего поиска, но, похоже, она 'read-only'. Мне нужно иметь возможность читать и записывать данные в этот столбец. –

ответ

4

EF 4 не имеет встроенной поддержки для sql_variant типа. This article объясняет, как делать чтение, сопоставляя объекты с пользовательскими запросами, захватывая тип и значение отдельно, а затем декодируя значение вручную в своем коде.

К сожалению, это решение не может быть адаптировано для записи данных назад. Вы можете попробовать mapping inserts/updates/deletes to stored procedures, но я не могу сказать вам точно, что он сработает, потому что я никогда не пробовал.

2

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

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

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

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

+0

Я не понимаю ни слова. Может быть, какой-нибудь пример? – ViRuSTriNiTy

Смежные вопросы