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?
是的 这是安全的,因为首先 organizations
被 EF 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
。
在 Load
和 Contains
的情况下,您在 Sql 上执行两个查询(分两次通过),但在 Include
的情况下,它是在一次通过中完成的,所以总体上它优于您的方法.
您可以使用 Sql Profiler
工具自行比较这些方法。
更新:
根据对话,我意识到 Johnny 的主要问题只是 OrganizationUsers
对象的存在。所以我建议将您的方法从 DB First
更改为 Code first
那么这个对象就可以明确存在!请参阅 this 以帮助您
另一种我认为可能可行的方法是自定义 T4 Template
,这似乎更难但并非不可能!
假设我们有以下数据库结构
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?
是的 这是安全的,因为首先 organizations
被 EF 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
。
在 Load
和 Contains
的情况下,您在 Sql 上执行两个查询(分两次通过),但在 Include
的情况下,它是在一次通过中完成的,所以总体上它优于您的方法.
您可以使用 Sql Profiler
工具自行比较这些方法。
更新:
根据对话,我意识到 Johnny 的主要问题只是 OrganizationUsers
对象的存在。所以我建议将您的方法从 DB First
更改为 Code first
那么这个对象就可以明确存在!请参阅 this 以帮助您
另一种我认为可能可行的方法是自定义 T4 Template
,这似乎更难但并非不可能!