私は非常に単純なデータモデルを持っています(下記)。ナビゲーションプロパティをデータベースからロードする方法を調べるのに問題があります。私はそれらを取得するのに問題はありませんが、ナビゲーションプロパティはEFによって設定されていませんが表示されます。私はいくつかの関連する質問を見てきましたが、少し異なっていたり、むしろ関与しています。私はEF 4.2(POCO)によってナビゲーション特性がどのように扱われるかについての情報を探しています。私が行った読書では、ナビゲーションプロパティを使って外部キーを持つオブジェクトにアクセスできるという印象を受けました。その代わりに、コンストラクタでコレクションをインスタンス化するかどうかによって、プロパティがnullまたは空に戻ってきます。EF 4.2 POCOでデータベースから検索すると、ナビゲーションプロパティがnullになるのはなぜですか?
public class AnimalDb : DbContext
{
public static AnimalDb Create(string fileName)
{
Database.DefaultConnectionFactory = new SqlCeConnectionFactory("System.Data.SqlServerCe.4.0");
return new AnimalDb(fileName);
}
private AnimalDb(string fileName) : base(fileName) { }
public DbSet<Animal> Animals { get; set; }
}
public class Animal
{
public Animal()
{
Id = Guid.NewGuid();
Traits = new ObservableCollection<Trait>();
}
public Guid Id { get; set; }
public string Species { get; set; }
public string Name { get; set; }
public ObservableCollection<Trait> Traits { get; set; }
}
public class Trait
{
public Trait()
{
Id = Guid.NewGuid();
}
public Guid Id { get; set; }
public string Name { get; set; }
}
そして、ここでそれを使用して、いくつかの(簡単な)コードです:
foreach (var animal in db.Animals)
{
foreach (var trait in animal.Traits)
{
//animal.Traits count is 0, so this does not run.
//However there are traits in the database, as my populate
//function is working fine.
Console.WriteLine("{0} is {1}", animal.Name, trait.Name);
}
}
----編集回答の概要----答えで提供記事や情報を使用して
以下では、db.Animals.Include()を使って熱心に読み込んだり、遅延読み込みを可能にしたりすることができました。遅延ロードを有効にして、それを使用できるというトリックがあります。私は次のように私のトレイトコレクションを変更
db.Configuration.LazyLoadingEnabled = true;
次へ:私は追加遅延ロードを有効にするにはまず、仮想作る
public virtual ObservableCollection<Trait> Traits { get; set; }
を遅延トレイトをロードする自動的に生成されたプロキシすることができます。それでおしまい! IMHO私はMSDNのドキュメントがこの負荷を叫び、POCO EF 4.2コーディング規約で明確にすべきだと思います。もう一度助けてくれてありがとう。
私はEF 4.2で多くのことをしていませんが、EF 4ではレイジーロードとプロキシを有効にする必要があります。そうしないと、ObjectContextに明示的にNavプロパティをロードする必要があります。 ) 'または' ObjectQuery.Include() 'です。 'DbContext'と同じですか? – CodingGorilla
これらのようなObjectContextメソッドにアクセスしようとしましたが、DbContext経由で利用できないようです。 – Nate
'DbContext'を使用しているときに' ObjectContext'と同じメソッドにアクセスすることはできませんが、それは小さなサブセットです。詳細はこちら:http://msdn.microsoft。com/en-us/library/gg696165(v = v103).aspx – CodingGorilla