web-dev-qa-db-ja.com

Entity Frameworkのコードファーストアプローチでdouble []配列をデータベースに格納する方法

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

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

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

タイプdouble[]は、パラメーター 'T'として使用するために、null不可の値タイプである必要があります。

Dataが保存されているクラスは、データベースに正常に保存され、このクラスとの関係が正常に保存されます。 Data列しかありません。

25
jonas

皆様のご協力に感謝します。あなたの助けにより、これを解決する最善の方法を追跡することができました。これは:

 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());
    }
 }

これらのstackoverflowの投稿のおかげで: String to Doubles array and Array of Doubles to a String

26
jonas

あなたはこのようなことをすることができます:

    [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; }
46
Joffrey Kern

私はそれが少し高いことを知っていますが、あなたはこれを行うことができます

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を幸せにする方法になります。

5
Nathan White

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

4
Husein Roncevic

Double [] use List instedは使用しないでください。

このような。

public class MyModel{
    ...
    public List<MyClass> Data { get; set; }
    ...
}

public class MyClass{
    public int Id { get; set; }
    public double Value { get; set; }
}

私が見ているその解決策はすべて悪いです:

  1. テーブルを作成する場合、「99.5,89.65,78.5,15.5」のようなデータを保存する必要はありません。これは無効です。まず文字列です。つまり、ASP.NETサーバーがdouble.Parseを呼び出したときに文字を入力できる場合、その結果、FormatExceptionが発生し、本当に望まないことになります。

  2. サーバーが文字列を解析する必要があるため、処理が遅くなります。 SQL Serverからほぼ使用可能なデータを取得する代わりに、なぜ文字列を解析するのですか?

1
Pavel B.

ネイサンホワイトがベストアンサーです(投票した)。

以下は、Joffrey Kernの回答を少し改善したもので、任意の長さ(テストされていない)のリストを許可します。

    [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; }
1
Jacob Brewer