0

SalesRep と Customer という 2 つのエンティティがあります。My Customer には OEM SalesRep と Direct SalesRep があるため、次のような 2 つの外部キーがあります。

public int OemRepId { get; set; }
[ForeignKey("OemRepId")]
public SalesRep OemRep { get; set; }

public int DirectRepId { get; set; }
[ForeignKey("DirectRepId")]
public SalesRep DirectRep { get; set; }

私のコンテキストでは、遅延読み込みを無効にしました (プロパティは仮想ではありません)。プロジェクト全体で明示的な読み込みを強制したい。コンテキストのコンストラクターで LazyLoading を無効にする方法を次に示します。

this.Configuration.LazyLoadingEnabled = false;

これで、コンテキストから顧客プロパティを受け取ると、OemRep と DirectRep の両方が正しい NULL になります。

次に、次のように OemRep を明示的にロードできます。

//I already have my CurrentCustomer entity loaded with its OemRep and DirectRep both NULL
_ctx.Entry(currentCustomer).Reference(c => c.OemRep).Load();

この行の直後にコードを挿入すると、OemRep 参照プロパティが読み込まれていることがわかります。これがバグです。

OemRepId と DirectRepId が同じである場合、OemRep と DirectRep の両方の参照プロパティが設定されます。それらが異なる場合は、次のように両方を明示的にロードする必要があります。

_ctx.Entry(currentCustomer).Reference(c => c.OemRep).Load();
_ctx.Entry(currentCustomer).Reference(c => c.DirectRep).Load();

明示的にロードしていないのに DirectRep が入力されるのはなぜですか?

4

1 に答える 1

0

EF は、コンテキスト内のすべてのプロパティに使用可能なデータを設定するのが最善の方法です。

id を使用して SalesRep 行をロードすると、その id を外部キーとして1764type のすべてのプロパティに入力できることを知っているのは賢明です。SalesRep

あなたの場合、同じデータベース行を参照する場合、ロードするとプロパティが設定される可能性があることを意味しOemRepます。DirectRep

外部キーが異なるSalesRepsを参照する場合は、両方を明示的にロードする必要があります。

于 2013-03-19T18:01:03.147 に答える