我们在基于Web的应用程序中使用Entity Framework +存储库模式来获取数据库。由于业务复杂,我们的模型有时会变得非常复杂,这会导致Entity Framework急切加载系统出现奇怪的行为。
请想象一下我们真实的模型是这样的。我们有表,框放在上面,笔盒可以在桌子上或箱子里,铅笔可以放在桌子上,箱子里或者笔盒里。
我们已经在应用程序中对此进行了建模。
我们的仓库模式实现类似于这个教程:http://www.asp.net/mvc/tutorials/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application。因此,我们调用get方法的方式如下。
所以问题在于结果与我的预期非常不同;我只期望会获取
我不明白为什么Entity Framework会获取除了Boxes.Pencils之外的所有Pencils。我还尝试使用表达式来指定包含列表,而不是查询路径,但结果没有改变。
请想象一下我们真实的模型是这样的。我们有表,框放在上面,笔盒可以在桌子上或箱子里,铅笔可以放在桌子上,箱子里或者笔盒里。
我们已经在应用程序中对此进行了建模。
public class Table
{
public int TableID{ get; set; }
public virtual ICollection<Box> Boxes{ get; set; }
public virtual ICollection<PencilCases> PencilCases{ get; set; }
public virtual ICollection<Pencils> Pencils{ get; set; }
}
public class Box
{
public int BoxID{ get; set; }
public int TableID{ get; set; }
[ForeignKey("TableID")]
public virtual Table Table{ get; set; }
public virtual ICollection<PencilCases> PencilCases{ get; set; }
public virtual ICollection<Pencils> Pencils{ get; set; }
}
public class PencilCases
{
public int PencilCaseID{ get; set; }
public int? BoxID{ get; set; }
public int TableID{ get; set; }
[ForeignKey("TableID")]
public virtual Table Table{ get; set; }
[ForeignKey("BoxID")]
public virtual Box Box{ get; set; }
public virtual ICollection<Pencils> Pencils{ get; set; }
}
public class Pencils
{
public int PencilID{ get; set; }
public int? PencilCaseID{ get; set; }
public int? BoxID{ get; set; }
public int TableID{ get; set; }
[ForeignKey("TableID")]
public virtual Table Table{ get; set; }
[ForeignKey("BoxID")]
public virtual Box Box{ get; set; }
[ForeignKey("PencilCaseID")]
public virtual PencilCase PancelCase{ get; set; }
}
我们的仓库模式实现类似于这个教程:http://www.asp.net/mvc/tutorials/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application。因此,我们调用get方法的方式如下。
var tables = unitOfWork.TableRepository.Get(includeProperties: "Boxes, PencilCases, Boxes.Pencils");
所以问题在于结果与我的预期非常不同;我只期望会获取
Boxes
,PencilCases
和Boxes.Pencils
集合,但实际上从数据库中获取了所有的Pencil实体,包括Pencils
,PencilCases.Pencils
和Boxes.PencilCases.Pencils
。这种递归获取导致了OutOfMemoryException
异常,因为数据量太大。我不明白为什么Entity Framework会获取除了Boxes.Pencils之外的所有Pencils。我还尝试使用表达式来指定包含列表,而不是查询路径,但结果没有改变。
PencilCases
和Pencils
?你应该通过箱子->笔盒->铅笔的方式获取例如桌子上的铅笔。你的模型有许多冗余的外键。这可能会导致你得到的行为,因为EF正在通过关系修复在子实体中建立所有这些关联。 - Gert ArnoldBoxes.Pencils
中的铅笔也会在其他Pencils
集合中找到。这并不一定意味着其他集合已经完全加载,但 EF 会尽可能建立关联。如果数据量很大,可能会导致 OOME。但你应该检查执行的查询语句。也许某个地方触发了延迟加载。 - Gert Arnold