2013-03-19 45 views
0

我有两个实体SalesRep和Customer。 我的客户有一个OEM的SalesRep和直接SalesRep的,因此两个外键,像这样:显式加载的EF 5.0错误?

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填充时,我没有明确装呢?

回答

0

EF尝试最好使用可用数据填充上下文中的所有属性。

它足够聪明地知道,当它加载SalesID行id为1764时,它可以使用该ID作为外键填充类型为SalesRep的所有属性。

就你而言,这意味着加载OemRep可能会填充DirectRep属性,如果它引用相同的数据库行。

如果外键引用不同SalesReps,你必须明确地加载两个。

+0

谢谢,这是我的想法,但我找不到任何文档说明如此。我看到EF足够聪明,但它在哪里记录?谢谢。 – BBauer42 2013-03-19 18:22:31

+0

我从来没有见过它的记录,但EF的表现,至少EF 4.0以来的表现。尽管如此,我看不到行为发生变化,因为很多人依赖它。 – 2013-03-19 18:32:10