2012-06-26 101 views
4

我的用例非常簡單。我有一個小桌子與這樣的柱:在實體框架中使用sql_variant 4

dtgTestValue sql_variant not null 

我創建了一個實體框架模型(.edmx文件),它跳過了該列的說法:

數據類型「的sql_variant」不支持;表'databaseFoo.dbo.Foobar'中的'dtgTestValue'列被排除。

我需要能夠讀取和寫入這個特定列的值。任何關於如何處理這個相當簡單的用例的建議?

+1

這裏有一個[文章](http://www.codeproject.com/Articles/137509/Reading-sql_variant-in-Entity-Framework)可能有幫助。 –

+0

@TheJonasPersson:在我的搜索過程中發現了這篇文章,但它似乎是「只讀」的。我需要能夠讀取和寫入數據到該列。 –

回答

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方法。我還在插入過程中將typeID設置爲一個唯一值,這對於使用LINQ where語句再次選擇適當類型的數據很有用。

我會建議爲同一張表創建一個基本模板類,但是LINQ在繼承時最好是笨重的,它根本無法工作。

這種方法確實會造成一點點重複,但仍然是一種很好的方法來完成這一任務,並且比其他建議的方法具有更少的缺點。

如果你想從表格中選擇所有的數據,不管變體的類型如何,我建議使用聯合運算符和一個單獨的中間類來加入所有的結果。

+0

我不明白一個單詞。任何例子也許? – ViRuSTriNiTy