簡體   English   中英

在實體框架4中使用sql_variant

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM