2

最初にエンティティ コードを使用して作成したデータベースがあります

そのDBには、次のような構造があります


class ClassA
{
  public virtual int ID {get;set}
  public virtual string some_text {get;set}
  public virtual ClassB B {get;set}
  public virtual ClassC C {get;set}
  ...
}

class ClassB
{
  public virtual int ID {get;set}
  public virtual string some_text {get;set}
  public virtual string some_values {get;set}
  ...
}

class ClassC
{
  public virtual int ID {get;set}
  public virtual string some_text {get;set}
  public virtual string some_values {get;set}
  ...
}
....

最後に、DB をクエリするためのすべてのインターフェイスを備えたこれらのオブジェクトのコンテキストがあります。


public class ClassADb : DBContext, IClassADataSource
{
  public DBSet<ClassA> As {get;set}
  public DBSet<ClassB> Bs {get;set}
  public DBSet<ClassC> Cs {get;set}
  ...
}

DB を作成して調べると、正しく作成されていることがわかります。

ClassA_Table には、ClassB_ID、ClassC_ID などの外部キーと、ClassA にカプセル化されたすべてのプリミティブ型 (int、string、bool、date など) が表示されます。

また、次の行に沿って何かを実行する場合:

ClassB MyB = new ClassB();
//some code to initialize B
...
Bs.Add(MyB)

ClassC MyC = new ClassC();
//some code to initialize C
Cs.Add(MyC);

ClassA MyA = new ClassA();

A.B = MyB;
A.C = MyC;
...

db.SaveChanges();

再び DB を調べて、Table_A に、これらの B および C オブジェクトへの参照を含む新しい行を確認します (行 ID は B_table 、 C_table 内のこれらのオブジェクトに対応します)。

私が抱えている問題は、 As container から選択すると、 A オブジェクトを取得できますが、ネストされた B および C オブジェクトは null です。

プリミティブ型は OK (空ではない)

私が試したいくつかの修正

virtualキーワードは lazy であるため、データベースにアクセスするクラスのコンストラクターで行いました

db.Configuration.ProxyCreationEnabled = false;

しかし、それでも、

A myA = db.As.Find(1);

A.some_text ; // not null
A.B ; //NULL!!!!
A.C ; // NULL

エンティティ フレームワークが A および B オブジェクトをフェッチしない原因は何ですか?

4

1 に答える 1

5

を使用して明示的に関連エンティティを明示的にロードする必要がありますInclude()

db.As.Include("B").Include("C").Where(a => [some condition]);

Entity Framework の新しいバージョンには、文字列を回避するラムダ式を受け入れるこのメソッドの周りのラッパー メソッドもあります。

db.As.Include(a => a.B).Include(a => a.C).Where(a => [some condition]);
于 2013-01-16T11:38:00.357 に答える