我有两个实体,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;
现在,当我从上下文收到customer属性时,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?
答案 0 :(得分:0)
EF尝试最好使用可用的数据填充上下文中的所有属性。
很明智地知道当它加载标识为1764
的SalesRep行时,它可以使用该id作为外键填充类型SalesRep
的所有属性。
在您的情况下,这意味着加载OemRep
可能会填充DirectRep
属性,如果它引用相同的数据库行。
如果外键引用了不同的SalesReps
,则必须明确加载它们。