实体框架中的自定义显式加载 - 以任何方式执行此操作?

时间:2011-01-24 22:13:52

标签: c# entity-framework lazy-loading

我有一个实体对象列表个人用于员工调查应用程序 - 个人代表员工或外部评估者。个人拥有父对象Team和Team.Organization,子对象Surveys,Surveys.Responses。反过来,回答与问题有关。

通常,当我想查看有关个人的完整信息时,我需要获取Individuals.Include(Team.Organization).Include(Surveys.Responses.Question)。

显然有很多包含,并且有性能成本,因此当我获取个人列表而不需要他们的相关对象时,我不打扰包含...但是用户想要操纵个人。所以这就是挑战。我似乎有3个选项,都很糟糕:

1)修改下载个人大名单的查询.Include(Team.Organization).Include(Surveys.Responses.Question)。这给它带来了不好的表现。

2)Individuals.Load(),TeamReference.Load(),OrganizationReference.Load(),Surveys.Load(),(并遍历调查列表并加载他们的响应和响应的问题)。

3)当用户希望操纵个人时,我删除该引用并通过其主键从数据库中获取整个全新的个人。这是有效的,但是很难看,因为这意味着我有两种不同的个体,我永远不能用一种代替另一种。如果我反复遍历列表,它也会产生难看的问题,因为避免重复加载和丢弃完全包含的个体是很棘手的,这很浪费。

有什么方法可以说

myIndividual.Include("Team.Organization").Include("Surveys.Responses.Question");

使用现有的Individual实体,而不是采用方法(3)?

也就是说,“从数据库预先获取所有内容”和“一次性加载一个关系”之间是否有任何中间立场?

可能的解决方案,我希望我能够深入了解:

所以没有办法在导航属性上手动实现显式加载?没办法让系统解释

Individual.Surveys = from survey in MyEntities.Surveys.Include("Responses.Question")
    where survey.IndividualID = Individual.ID
    select survey; //Individual.Surveys is the navigation collection property holding Surveys on the Individual.
Individual.Team = from team in MyEntities.Teams.Include("Organization")
    where team.ID = Individual.TeamID
    select team; 

只是从数据库加载个人的相关对象而不是分配/更新操作?如果这意味着X和Y没有实际变化,我可以这样做吗?

我想要一种方法来手动实现一个懒惰或显式的加载,而不是一个哑巴(一次一个关系)的方式。实际上,团队和组织不是问题,但Survey.Responses.Questions是一个巨大的数据库点击量。

我正在使用3.5,但是为了其他人(当我的项目最终迁移到4时)我肯定会赞赏与4相关的回复。在这种情况下,类似的延迟加载定制也很好听。

编辑:将字母汤切换到我的问题域,为清晰起见进行了编辑。

由于

1 个答案:

答案 0 :(得分:0)

Include语句旨在完成您希望做的事情。拥有多个包含确实需要加载相关实体。

这是一篇关于它的好文章:

http://thedatafarm.com/blog/data-access/the-cost-of-eager-loading-in-entity-framework/

此外,您可以使用强类型的“包含”使用一些漂亮的ObjectContext扩展方法。这是一个例子:

http://blogs.microsoft.co.il/blogs/shimmy/archive/2010/08/06/say-goodbye-to-the-hard-coded-objectquery-t-include-calls.aspx