0

我有两个实体,SalesRep 和 Customer。我的客户有一个 OEM SalesRep 和一个 Direct SalesRep,因此有两个外键,如下所示:

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 作为外键1764填充类型的所有属性,这很聪明。SalesRep

在您的情况下,这意味着加载 anOemRep可能会填充DirectRep属性,如果它引用相同的数据库行。

如果外键引用不同SalesReps,则必须显式加载两者。

于 2013-03-19T18:01:03.147 回答