我的用例非常簡單。我有一個小桌子與這樣的柱:在實體框架中使用sql_variant 4
dtgTestValue sql_variant not null
我創建了一個實體框架模型(.edmx文件),它跳過了該列的說法:
數據類型「的sql_variant」不支持;表'databaseFoo.dbo.Foobar'中的'dtgTestValue'列被排除。
我需要能夠讀取和寫入這個特定列的值。任何關於如何處理這個相當簡單的用例的建議?
我的用例非常簡單。我有一個小桌子與這樣的柱:在實體框架中使用sql_variant 4
dtgTestValue sql_variant not null
我創建了一個實體框架模型(.edmx文件),它跳過了該列的說法:
數據類型「的sql_variant」不支持;表'databaseFoo.dbo.Foobar'中的'dtgTestValue'列被排除。
我需要能夠讀取和寫入這個特定列的值。任何關於如何處理這個相當簡單的用例的建議?
EF 4沒有對sql_variant
類型的內置支持。 This article解釋瞭如何通過將實體映射到自定義查詢來進行讀取,分別捕獲類型和值,然後在代碼中手動解碼值。
不幸的是,這個解決方案不適用於寫回數據。您可以嘗試mapping inserts/updates/deletes to stored procedures,但我無法確定它會起作用,因爲我從未嘗試過它。
有點遲到派對,但仍然有另一種方法來做到這一點,可以爲每個要存儲在數據庫表中的變體「類型」創建一個單獨的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在繼承時最好是笨重的,它根本無法工作。
這種方法確實會造成一點點重複,但仍然是一種很好的方法來完成這一任務,並且比其他建議的方法具有更少的缺點。
如果你想從表格中選擇所有的數據,不管變體的類型如何,我建議使用聯合運算符和一個單獨的中間類來加入所有的結果。
我不明白一個單詞。任何例子也許? – ViRuSTriNiTy
這裏有一個[文章](http://www.codeproject.com/Articles/137509/Reading-sql_variant-in-Entity-Framework)可能有幫助。 –
@TheJonasPersson:在我的搜索過程中發現了這篇文章,但它似乎是「只讀」的。我需要能夠讀取和寫入數據到該列。 –