如何禁用所有延迟加载
首先从数据库生成模型后我有
public partial class company
{
public int id { get; set; }
public string name { get; set; }
public virtual ICollection<user> user { get; set; }
}
public partial class user
{
public int id { get; set; }
public int company_id { get; set; }
public virtual company company { get; set; }
}
我想加载仅用户和他们的公司
db = new Entities();
db.Configuration.ProxyCreationEnabled = false;
db.Configuration.LazyLoadingEnabled = false;
var result = db.user.Include(x => x.company).ToList();
我不想加载result[0].company.user
现在集合充满了公司的所有用户
result[0].company.user 必须为空
如果我想加载 result[0].company.user 我想使用 .Include(x => x.company.user)
最佳答案
这不是延迟加载,而是一个称为关系修复的不同概念。简而言之,它只是保持导航属性彼此同步。在您的情况下,您具有 user.company
导航属性和 company.user
集合导航属性。您同时加载用户和公司,并将它们附加到上下文。现在在某些点(您可以找到这些点的列表 here )EF 执行关系修复。在这种情况下,它发生在对 DbSet 执行查询之后。 EF 确保如果设置了 user.company
- company.user
集合也应包含该 user
,因为它们是相关的导航属性。此用户已附加到上下文(您最初使用查询加载它),因此不会对数据库进行其他查询,因此它不是延迟加载。
使用延迟加载,如果公司 A 有 100 个用户,则 companyA.user
将包含 100 个条目(当您访问此属性时从数据库加载)。在您的情况下,即使公司 A 有 100 个用户 - companyA.user
也将只包含 1 个用户 - 您最初加载的用户。
这种行为通常没有问题,但在某些情况下它可能会导致问题 - 大多数情况下,当您想要序列化 EF 对象并因此进入循环引用时,就会发生这种情况。
据我所知,无法禁用此行为。
关于c# - EntityFramework 6 DatabaseFirst 禁用延迟加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45029284/