gpt4 book ai didi

c# - Entity Framework 中的自定义显式加载 - 有什么办法吗?

转载 作者:太空宇宙 更新时间:2023-11-03 16:49:00 24 4
gpt4 key购买 nike

我有一个员工调查应用程序的实体对象 Individual 列表 - Individual 代表员工或外部评估者。个人具有父对象 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) 当用户希望操纵一个 Individual 时,我删除该引用并通过其主键从数据库中获取一个全新的 Individual。这行得通,但很难看,因为这意味着我有两种不同的个体,而且我永远不能用一种代替另一种。如果我重复遍历一个列表,它也会产生丑陋的问题,因为要避免重复加载和删除完全包含的个体是很棘手的,这是一种浪费。

有没有办法说

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

与现有的个人实体,而不是采用方法 (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 没有实际变化,我可以这样做吗?

我想要一种方法来手动实现惰性或显式加载,而不是以一种愚蠢的方式(一次一个关系)。确实,团队和组织不是问题,但调查.Responses.Questions 是数据库点击量的巨大负担。

我使用的是 3.5,但为了其他人(以及当我的项目最终迁移到 4 时),我确信与 4 相关的回复将不胜感激。在这种情况下,延迟加载的类似定制也很高兴听到。

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

谢谢

最佳答案

Include 语句旨在完全按照您希望的方式进行操作。拥有多个包含确实会急切加载相关实体。

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

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

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

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

关于c# - Entity Framework 中的自定义显式加载 - 有什么办法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4787823/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com