2

既存のデータベースで EF Code First を使用しています。

2 つのオブジェクト:

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

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

FooIdとの両方BarIdがデータベースの主キーであり、テーブルにはテーブルを指す外部キーでBarある列があります。FooIdFoo

を選択するBarFoo、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");
    }
}
4

2 に答える 2

2

Foo に対する期待が null であってはならないのは、Bar オブジェクトで仮想化するという事実から来ている場合、そうではありません。それらを仮想化することで、EF 遅延読み込みを選択するだけで、Bar オブジェクトにアクセスして明示的に要求するまで null になります。それ以外に、前もって入力したい場合は、Includeメソッドを使用して熱心にロードする必要があります。

遅延読み込みを明示的に無効にするには、次のコードを使用できますが、ナビゲーション プロパティからvirtualキーワードを削除するだけで遅延読み込みがなくなるため、必要ありません。

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

内部的に、DbContext は、継承された DbContext クラス (EFCodeFirst など) 内でも使用できる保護されたObjectContext を使用します。

于 2010-11-19T05:18:25.837 に答える
0

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

于 2010-11-19T09:41:29.207 に答える