我想使用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();
我很好奇,如果在实体框架中只有一个我不了解的方法来构建这些类型的关系。如果有人知道一个简单的方法来逐步填写导航属性,我会很感激代码示例。
答案 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没有直接支持我想要的功能。为了防止大量连接并在多次调用数据库时中断结果,必须再次从数据库下载最顶层的实体。这意味着结果集中最左侧的列将是为每个记录重复的该实体的列。