Entity framework 4 EF4使用POCO时在单独查询中获取关联

Entity framework 4 EF4使用POCO时在单独查询中获取关联,entity-framework-4,include,poco,entity-relationship,multi-step,Entity Framework 4,Include,Poco,Entity Relationship,Multi Step,我想使用EntityFramework4.2构建一个对象图 现在,我有POCO实体,使用ICollection作为导航属性。我想避免使用EntityCollection或任何特定于EF的东西 我想避免过度使用Include导致的大量连接。给定一个对象,我希望填充其导航属性,从而生成一个单独的数据库查询 有没有办法直接填充ICollection?现在,我正在努力解决这个问题,但这真的很痛苦 // grab the user, brand users and brands User user = e

我想使用EntityFramework4.2构建一个对象图

现在,我有POCO实体,使用ICollection作为导航属性。我想避免使用EntityCollection或任何特定于EF的东西

我想避免过度使用Include导致的大量连接。给定一个对象,我希望填充其导航属性,从而生成一个单独的数据库查询

有没有办法直接填充ICollection?现在,我正在努力解决这个问题,但这真的很痛苦

// grab the user, brand users and brands
User user = entities.Users
                    .Include(item => item.BrandUsers.Select(brandUser => brandUser.Brand))
                    .Where(item => item.Name == userName)
                    .SingleOrDefault();
// grab the pending share grants and brands
entities.Users
        .Include(item => item.ToShareGrants.Select(shareGrant => shareGrant.Brand))
        .Where(item => item.Id == user.Id)
        .Load();
return user;
我不喜欢这种方法的一点是,我正在重新查询顶级对象。如果我不这样做,当没有返回对象时,导航属性不会被填充(保留为NULL)。例如,以下代码仅在返回结果时有效:

entities.ShareGrants
        .Include(item => item.Brand)
        .Where(item => item.ToUserId == user.Id)
        .Load();

我很好奇,在实体框架中是否有一种方法我不知道,可以用来构建这些类型的关系。如果有人知道一种在步骤中填写导航属性的简单方法,我希望有一个代码示例。

请尝试关闭当前查询的延迟加载,您可以将其放在using块中

entities.ContextOptions.LazyLoadingEnabled = false;

你的问题不是很清楚。为什么不在同一查询中使用多个
Include
s

User user = entities.Users
      .Include(item => item.BrandUsers.Select(brandUser => brandUser.Brand))
      .Include(item => item.ToShareGrants.Select(shareGrant => shareGrant.Brand))
      .Where(item => item.Name == userName)
      .SingleOrDefault();

这个问题的简单答案是EF4没有直接支持我想要的功能。为了防止大规模连接并在对数据库的多次调用中中断结果,必须再次从数据库下载最顶层的实体。这意味着结果集中最左边的列将是每个记录中重复的该实体的列。

如果使用多个包含,可能会导致大量连接。此外,根据需要,我可以有条件地构建对象图的不同部分。@TravisParks如果不预先加载它们,加载每个导航属性将发出数据库请求。每种方法都有它的折衷,为每种情况选择最好的方法。在我的场景中,我想要一个数据库命中率。我关闭了延迟加载和代理生成。似乎包含是填充导航属性的唯一方法。我要寻找的是一种显式加载导航属性的方法(通过数据库查询)。