29

既存のコードとアーキテクチャ設計に影響を与えることなく、Entity Framework Code-First を使用して double の配列をデータベースに格納するにはどうすればよいですか?

Data Annotation と Fluent API を見てきました。double 配列をバイト文字列に変換し、そのバイトをデータベースの独自の列に格納することも検討しました。

public double[] Data { get; set; }Fluent API でプロパティにアクセスできません。次に表示されるエラー メッセージは次のとおりです。

double[]は、パラメーター 'T' として使用するために、null 非許容値型である必要があります。

が格納されているクラスがDataデータベースに正常に格納され、このクラスとの関係が保持されます。Data列が欠けているだけです。

4

9 に答える 9

50

次のようなことができます:

    [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; }
于 2013-03-05T10:07:25.350 に答える
30

あなたの助けのおかげで、これを解決するための最良の方法を突き止めることができました。それは次のとおりです。

 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 arrayおよび Array of Doubles to a String

于 2013-03-05T12:07:23.143 に答える
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; }
}

これにより、単一のエンティティ (ここでは「参照」) がプリミティブ クラスの「リスト」にマップされます。これは基本的に、SQL データベースを満足させ、データのリストを適切に使用できるようにするためです。

これはあなたのニーズに合わないかもしれませんが、EF を満足させる方法です。

于 2013-03-05T10:42:38.677 に答える
4

List<double>ではなくを使用すると、はるかに簡単になりますdouble[]。値を格納するテーブルがすでにありDataます。おそらく、あるテーブルからdouble値が格納されているテーブルへの外部キーがあります。doubleが格納されているテーブルを反映する別のモデルを作成し、mappingsクラスに外部キーマッピングを追加します。そうすれば、クラスプロパティの値を取得または保存する複雑なバックグラウンドロジックを追加する必要がなくなります。

于 2013-03-05T11:05:31.957 に答える