如何停用所有延迟加载
首先从数据库生成模型后我有
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();
我不想加载结果[0] .company.user
现在收集了所有公司用户
result [0] .company.user 必须为null
如果我想加载结果[0] .company.user 我想使用 .Include(x =&gt; x.company.user)
答案 0 :(得分:4)
这不是延迟加载,而是一种称为关系修复的不同概念。简而言之,它只是使导航属性保持彼此同步。在您的情况下,您拥有user.company
导航属性和company.user
集合导航属性。您加载用户和公司,并将它们附加到上下文。现在在某些点(您可以找到here这些点的列表)EF执行关系修复。在这种情况下,它发生在对DbSet执行查询之后。 EF确保如果设置user.company
,company.user
集合也应包含user
,因为这些是相关的导航属性。此用户已附加到上下文(您最初使用查询加载它),因此不会对数据库进行其他查询,因此不会延迟加载。
使用延迟加载时,如果公司A有100个用户,则companyA.user
将包含100个条目(当您访问此属性时从数据库加载)。在您的情况下,即使公司A有100个用户 - companyA.user
将只包含1个用户 - 您最初加载的用户。
这种行为通常很好,但在某些情况下它可能会导致麻烦 - 大多数情况下,当您想要序列化EF对象并因此而进入循环引用时会发生这种情况。
没有办法禁用我所知道的这种行为。