2010-11-19 11 views
2

私は既存のデータベースでEFコードファーストを使用しています。EFコード最初に関連するオブジェクトを返さない

2つのオブジェクト:

public Foo 
{ 
    public int FooId {get;set;} 
} 

public Bar 
{ 
    public int BarId {get;set;} 
    public virtual Foo Foo {get;set;} 
} 

FooIdBarId両方が、データベース内の主キーであり、BarテーブルがFooテーブルを指す外部キーであるカラムFooIdを有しています。

Barを選択すると、Fooはnull参照です。私はEFが自動的に2人を一緒に引っ張ってくれると思っていただろうが、おそらく私は何かを欠いているだろうか?

データベースのマッピング:

public class EFCodeFirst : DbContext 
{ 
    public EFCodeFirst() 
    { 
     this.Database.Connection.ConnectionString = ConfigurationManager.ConnectionStrings["AlternateString"].ConnectionString; 
    } 

    public DBSet<Foo> Foos {get;set;} 
    public DBSet<Bar> Bars {get;set;} 

    protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder) 
    { 
     modelBuilder.IncludeMetadataInDatabase = false; 
     modelBuilder.Entity<Foo>().MapSingleType().ToTable("Foo"); 
     modelBuilder.Entity<Bar>().MapSingleType().ToTable("Bar"); 
    } 
} 
+0

コードを最初にマッピングすることもできますか? Include( "Foo")を使用してクエリを呼び出すとどうなりますか? –

+0

I 'Include(" Foo ")を実行すると動作します。 – mattdwen

答えて

2

はFooのあなたの期待はnullにすべきではない場合はバーのオブジェクトの上に仮想作るという事実から来ている、それはそうではないのです。それらをバーチャルにすることで、EF遅延ロードを選択するだけで、Barオブジェクトにアクセスして明示的に要求するまで、nullになります。それ以外の場合は、前もって入力する必要がある場合は、を含めて熱心にロードする必要があります。メソッドを含みます。

明示的に遅延ロードを無効にするには、ナビゲーションプロパティから仮想キーワードを削除して遅延ロードをなくすだけで済みますので、次のコードを使用できます。

public EFCodeFirst() 
{   
    this.ObjectContext.ContextOptions.LazyLoadingEnabled = false; 
} 

内部的には、DbContextはまた、あなたの継承DbContextクラス(例えばEFCodeFirst)の内部で使用することができます保護のObjectContextを使用しています。

+0

しかしどちらの方法でも解決しなければならないのですか? DBへの早期コールまたは後でのコール。 – mattdwen

+0

遅延読み込みを無効にするタイミングもわかりません。どのオブジェクトも 'ContextOptions.LazyLoadingEnabled'への参照を持っていません。 – mattdwen

+0

はい、それは正しく、動作します。動作しないコードを表示する必要があります。 –

0

Fooクラスに行がありません.FooにはBarのコレクションが含まれています。

+0

現在、親FooからBarオブジェクトにアクセスする必要はありません。 – mattdwen

+0

はい、それはEFに関係を作るように指示しますが、それはあなたにヌル参照例外を与えません –

関連する問題