0

私はかなり複雑なSQLデータベースでウェブサイトを構築しています。複数のプリミティブフィールド(すべて正常に機能します)と複数のを保持
するクラスを作成しました。私のソリューションのフォルダの下にも定義されています。また、の単一のインスタンスを保持します。次に、を継承するクラスを作成しました。QueryList<SomeType>SomeTypeModelsSomeTypeQueryDBContextDbContext

Generate文字列を受け取り、完全に形成されたQueryインスタンスを作成する関数があります。すぐに送信すると、View問題なく動作します。しかし、それを自分のに格納するとDB、プリミティブ値のみが保持され、参照型(Lists<SomeType>との両方SomeType)はになりnullます。

問題は、EFが参照型をサポートしていないことだと思います。あるいは、この場合に何か特別なものが必要なのでしょうか。
これがQuery

public class Query
{
    [Key]
    public int id { get; set; }

    public SomeType Base { get; set; }
    public List<SomeType> Derived { get; set; }
    //more of these

    public string SmallGraphImage { get; set; }
    public string MediumGraphImage { get; set; }
    public string LargeGraphImage { get; set; }
}
public class QueriesDBContext : DbContext
{
    public DbSet<Query> Queries { get; set; }
}

これがSomeType

public class SomeType
{
    [Key]
    public int id { get; set; }
    public string ExpandedOutForm { get; set; }
    public string ExpandedInForm { get; set; }
    //more strings
}


注:データベースはプリミティブに対して正常に機能します。開発の目的で、Controller変更ごとにデータベースを削除して再構築するを作成しました。また、に置き換えListてみましたIList

EFが参照型をサポートしていない場合、どうすればよいですか?動作しstructsますか?Listsデータベースエントリ内に保存するにはどうすればよいですか?(ええ、IDを使用して別のテーブルに保存できますが、EFにはこれに対するより洗練されたソリューションがあると思います)

4

2 に答える 2

3

問題は、EFが参照型をサポートしていないことだと思います

EntityFrameworkは参照型をサポートしています。デフォルト構成では、これらは個別のデータベーステーブルにマップされます。あなたの場合、Query_id列がテーブル「SomeTypes」に追加されます。Entity Frameworkは、これらを使用して、データをロードするときにSQL結合を作成します。

プロパティが表示されている理由NULLは、これとは関係ありません。これは、EntityFrameworkがデータをロードする方法と関係があります。デフォルトでは、EFは最初からオブジェクトグラフ全体をロードしません。これは、SomeType別のクラスを参照する別のクラスを参照する場合、1回の呼び出しでデータベース全体をロードすることを意味します。

2つのオプションがあります。

  • 参照を明示的にロードします。事前に使用するプロパティをEntityFrameworkに通知すると、データベースからの1回の呼び出しでそれらが読み込まれます。

    クエリc=ctx.Queries .Include(x => x.Derived).Include(x => x.Base).First();

ここでは、メソッドを使用して、両方のコレクションをプロパティとしてInclude読み込むようにEntityFrameworkに指示します。DerivedBase

  • 遅延読み込みを使用します。これは、EntityFrameworkが必要なときにプロパティをロードすることを意味します。これが機能するために、EFはクラスをラップするプロキシクラスを作成し、データベース呼び出しをちょうど間に合うように実行します。

    public SomeType Base { get; set; }これを機能させるには、EFがプロキシを作成してそれらの呼び出しを傍受できるように、仮想として宣言する必要があります。

データが表示されない唯一の理由は、データがデータベースからロードされていないためです。

于 2012-08-31T14:03:23.733 に答える
1

問題は、EFが参照型をサポートしていないことだと思います

EFは参照型をサポートしています-それらは基本的に他のテーブルにマップされています。

(ええ、IDを使用して別のテーブルに保存できますが、EFにはこれに対するより洗練されたソリューションがあると思います)

実際、これはまさにEFがデフォルトで1-多くの関係を処理する方法です。それらを1つのテーブルにどのように保存するつもりですか?

于 2012-08-31T13:49:28.707 に答える