2013-03-05 17 views
17

如何使用實體框架代碼優先將雙精度數組存儲到數據庫中,而不會影響現有的代碼和體系結構設計?我已經考慮過將數組轉換爲一個字節字符串,並將該字節存儲到自己列中的數據庫中。如何使用實體框架將double []數組存儲到數據庫中代碼優先

我不能流利API訪問public double[] Data { get; set; }屬性,錯誤消息,然後我得到的是:

類型double[]必須是一個非空值類型,以便使用 它作爲參數「T」 。

存儲Data的類已成功存儲在數據庫中,並且與該類的關係成功存儲。我只錯過了Data列。

+0

什麼是數據代表什麼?也許有一種方法可以調整你的代碼,使所有的工作都可以正常工作,而不會改變架構太多。 – 2013-03-05 10:05:31

+0

或者,對於一個簡單的修復,在寫入數據庫時​​,是否可以不用逗號分隔的字符串和所有的double值,然後在需要值時解析字符串? – 2013-03-05 10:06:18

+0

@NathanWhite與這個逗號分隔字符串方法是我們正在考慮的東西。但是我們希望EF能夠更自動化。考慮到這個問題的答案告訴我,沒有辦法使用EF自動向數據庫表示雙精度數組。正確? – jonas 2013-03-05 10:22:17

回答

16

謝謝大家的意見,由於你的幫助,我能夠找到解決這個問題的最佳方法。那就是:

public string InternalData { get; set; } 
public double[] Data 
{ 
    get 
    { 
     return Array.ConvertAll(InternalData.Split(';'), Double.Parse);     
    } 
    set 
    { 
     _data = value; 
     InternalData = String.Join(";", _data.Select(p => p.ToString()).ToArray()); 
    } 
} 

由於這些計算器帖子: String to Doubles arrayArray of Doubles to a String

+1

如果有人想知道,'InternalData'必須是公開的,否則它不會成爲數據庫模式的一部分。儘管沒有必要,向'Data'屬性添加'[NotMapped]'也是一個好主意。這表明該屬性不是數據庫模式的一部分。 – 2017-10-02 11:37:48

36

你可以做這樣的事情:

[NotMapped] 
    public double[] Data 
    { 
     get 
     { 
      string[] tab = this.InternalData.Split(','); 
      return new double[] { double.Parse(tab[0]), double.Parse(tab[1]) }; 
     } 
     set 
     { 
      this.InternalData = string.Format("{0},{1}", value[0], value[1]); 
     } 
    } 

    [EditorBrowsable(EditorBrowsableState.Never)] 
    public string InternalData { get; set; } 
5

我知道這是一個有點貴,但你可以做到這一點

class Primitive 
{ 
    public int PrimitiveId { get; set; } 
    public double Data { get; set; } 

    [Required] 
    public Reference ReferenceClass { get; set; } 
} 

// This is the class that requires an array of doubles 
class Reference 
{ 
    // Other EF stuff 

    // EF-acceptable reference to an 'array' of doubles 
    public virtual List<Primitive> Data { get; set; } 
} 

現在,這將映射一個單一的實體(這裏的參考')添加到您的Primitive類的「列表」中。這基本上是爲了讓SQL數據庫很高興,並允許您適當地使用您的數據列表。

這可能不適合您的需求,但將是一種讓EF快樂的方式。

4

如果您使用List<double>而不是double[],那將會容易得多。你已經有一個表格來存儲你的Data值。您可能有一些表中的外鍵存儲了您的double值。創建反映存儲雙精度的表的另一個模型,並在映射類中添加外鍵映射。這樣你就不需要添加一些複雜的後臺邏輯來檢索或存儲類屬性中的值。

1

拿白棋的最佳答案(得到我的選票)。

這裏是喬佛裏在克恩的答案小的改進,允許任何長度(未經測試)的列表:

[NotMapped] 
    public IEnumerable<double> Data 
    { 
     get 
     { 
      var tab = InternalData.Split(','); 
      return tab.Select(double.Parse).AsEnumerable(); 
     } 
     set { InternalData = string.Join(",", value); } 
    } 

    [EditorBrowsable(EditorBrowsableState.Never)] 
    public string InternalData { get; set; } 
相關問題