[英]Using sql_variant with Entity Framework 4
我的用例非常簡單。 我有一個帶有這樣的列的小桌子:
dtgTestValue sql_variant not null
我創建了一個實體框架模型(.edmx文件),它跳過了該列,說:
不支持數據類型“ sql_variant”。 表'databaseFoo.dbo.Foobar'中的'dtgTestValue'列被排除。
我需要能夠在此特定列中讀取和寫入值。 關於如何處理這個相當簡單的用例的任何建議?
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在繼承方面充其量是笨拙的,而且根本行不通。
此方法確實會造成一點重復,但仍是完成此操作的一種簡潔方法,與其他建議方法相比,缺點更少。
如果您想從表中選擇所有數據,而不管變量類型如何,我建議將聯合運算符與單獨的中間類一起使用,以合並所有結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.