我一直在使用 Entity Framework Profiler 来测试我在 MVC 项目中的数据访问,并且遇到了几个页面,由于 N+1 问题,我进行的数据库查询比我需要的要多得多。
这是一个显示我的问题的简单示例:
var club = this.ActiveClub; // ActiveClub uses code similar to context.Clubs.First()
var members = club.Members.ToList();
return View("MembersWithAddress", members);
视图循环遍历成员,然后跟随每个成员的导航属性来显示他们的地址。每个地址请求都会导致额外的数据库查询。
解决此问题的一种方法是使用 Include 来确保预先查询我需要的额外表。但是,我似乎只能在直接附加到上下文的俱乐部 ObjectSet 上执行此操作。在这种情况下,ActiveClub 属性由许多控制器共享,我并不总是想预先查询成员和地址表。
我希望能够使用类似的东西:
var members = club.Members.Include("Address").ToList();
但是,Members 是一个 EntityCollection,它没有 Include 方法。
有没有办法强制加载成员 EntityCollection 并要求 EF 也加载他们的地址?
或者,以这种方式在实体上使用 EntityCollection 导航属性,这是一个非常糟糕的主意;当你从上下文中得到它时,你应该知道你正在加载什么?