EF是否自动加载多对多引用集合

Does EF automatically load many to many references collections

假设我们有以下数据库结构

 Organization 
 {
    Guid OrganizationId
    //....
 }

 User 
 {
    Guid UserId
 }

 OrganizationUsers
 {
     Guid OrganizationId
     Guid UserId 
 }

当 edmx 生成此 class 时,它会将 OrganizationUsers 抽象为多对多引用。因此不会为其生成 POCO class。

假设我正在从我的上下文加载数据,但为了避免笛卡尔生产,我不使用 include 我做了两个单独的查询。

using(var context = new EntitiesContext())
{
    var organizationsQuery =  context.Where(FilterByParent);
    var organizations = organizationsQuery.ToList();
    var users = organizationsQuery.SelectMany(x => x.Users).Load();
}

假设连接的实体已加载是否安全? 如果我直接从 DBSet 加载用户,这会有什么不同吗?

从数据库的角度来看:

Is it safe to assume that the connected entitites are loaded?

是的 这是安全的,因为首先 organizationsEF Change Tracker 跟踪,然后通过在下一个语句中调用 Load EF 知道结果应该附加到被跟踪的实体

Would this make any difference if I loaded the users directly from the DBSet?

事实上使用 Load 这种方式并不比 Include 更好!

如果使用 Include EF 将其转换为 LEFT JOIN,如果使用 Load 将转换为 INNER JOIN,如果直接通过用户获取用户使用 Contains 方法的 ID 将在 Sql 侧被翻译成 IN。 在 LoadContains 的情况下,您在 Sql 上执行两个查询(分两次通过),但在 Include 的情况下,它是在一次通过中完成的,所以总体上它优于您的方法.

您可以使用 Sql Profiler 工具自行比较这些方法。


更新:

根据对话,我意识到 Johnny 的主要问题只是 OrganizationUsers 对象的存在。所以我建议将您的方法从 DB First 更改为 Code first 那么这个对象就可以明确存在!请参阅 this 以帮助您

另一种我认为可能可行的方法是自定义 T4 Template,这似乎更难但并非不可能!