使用POCO时,EF4在单独查询中获取关联

时间:2012-01-26 22:22:47

标签: entity-framework-4 include poco entity-relationship multi-step

我想使用Entity Framework 4.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();

我很好奇,如果在实体框架中只有一个我不了解的方法来构建这些类型的关系。如果有人知道一个简单的方法来逐步填写导航属性,我会很感激代码示例。

3 个答案:

答案 0 :(得分:0)

尝试关闭当前查询的延迟加载,您可以将其放入使用块

entities.ContextOptions.LazyLoadingEnabled = false;

答案 1 :(得分:0)

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

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();

答案 2 :(得分:0)

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