0

我想使用Entity Framework 4.2构建对象图。EF4使用POCO在单独查询中获取关联

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

我想避免由于使用过大而导致的大量连接。给定一个对象,我想填充它的导航属性,导致一个单独的数据库查询。

有没有办法直接填充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; 

我不喜欢这种方法的一件事是我重新查询顶层对象。如果我不这样做,当没有对象返回时,导航属性不会被填充(留空)。例如,下面的代码如果仅仅作品被返回的结果:

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

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

回答

0

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

0

尝试关闭延迟加载当前的查询,你可能只是把这个using块

entities.ContextOptions.LazyLoadingEnabled = false; 
+0

我关闭了延迟加载和代理生成。看来Include是填充导航属性的唯一方法。我正在寻找的是一种显式加载导航属性的方法(通过数据库查询)。 – 2012-01-27 01:02:42

0

你的问题不是很清楚。为什么在同一个查询

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

如果我使用多个Includes,它可能会导致大量连接。另外,根据需要,我可以有条件地构建对象图的不同部分。 – 2012-01-27 00:52:52

+0

@TravisParks如果您不预先加载它们,则加载每个导航属性将发出数据库请求。每种方法都有其权衡,选择最适合每种情况的方法。 – Eranga 2012-01-27 01:23:34

+0

我想要一个数据库命中,在我的方案中。 – 2012-01-27 02:25:49