0

Code-First で EntityFramework 5.0 を使用しています。次のような POCO クラス Foo があります。

public class Bar
{
    public int FooID { get; set; }
    public virtual Foo Foo { get; set; }

    public int OtherFooID { get; set; }
    public virtual Foo OtherFoo { get; set; }
}

私の DbContext では、遅延読み込みがオンになっています。コンテキストから Foo をロードすると、FooID を外部キーとして使用して、プロパティ「Foo」が遅延ロードされます。ただし、どのように試しても「OtherFoo」はロードされません。

Foo f = bar.Foo;         // A proxy type, which loads in the data from the DB correctly
Foo f = bar.OtherFoo;    // is null, not lazily loaded
Foo f = context.Bars.Include("OtherFoo").First(...).OtherFoo;   // Still null

(重要な場合、UserProfile テーブルがあり、モデル オブジェクトには CreatedByUser フィールドと LastModifiedByUser フィールドがありますが、いずれかの名前とそれに関連付けられている *ID フィールドを「User」に変更しない限り、どちらも機能しません)

これらのフィールドに貼り付けてエンティティにロード方法を伝えることができる属性はありますか、それともオーバーライドした場合に DbContext.OnModelBuilding メソッドで設定できるものはありますか?

4

1 に答える 1

0

OtherFooIDEFがの外部キーとして認識しないように、マッピングの問題を推測しOtherFooます。OtherFooIDnull 許容ではなく、リレーションシップが必要です。つまり、データベースにリレートが必要OtherFooです(DB で FK 制約の適用がオフになっている場合を除く)。

データ注釈を使用して外部キーを明示的に指定できます...

[ForeignKey("OtherFoo")]
public int OtherFooID { get; set; }

... または流暢な API:

modelBuilder.Entity<Bar>()
    .HasRequired(b => b.OtherFoo)
    .WithMany() // add f => f.OtherBars here, if you have a collection in Foo
    .HasForeignKey(b => b.OtherFooID);

「複数のカスケード削除パスは許可されていません」という例外が発生した場合は、追加します

    .WillCascadeOnDelete(false);

Fluent マッピングの最後に。

于 2013-04-19T14:15:02.497 に答える