EntityFramework 6 DatabaseFirst禁用延迟加载

时间:2017-07-11 08:29:30

标签: c# entity-framework

如何停用所有延迟加载

首先从数据库生成模型后我有

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)

1 个答案:

答案 0 :(得分:4)

这不是延迟加载,而是一种称为关系修复的不同概念。简而言之,它只是使导航属性保持彼此同步。在您的情况下,您拥有user.company导航属性和company.user集合导航属性。您加载用户和公司,并将它们附加到上下文。现在在某些点(您可以找到here这些点的列表)EF执行关系修复。在这种情况下,它发生在对DbSet执行查询之后。 EF确保如果设置user.companycompany.user集合也应包含user,因为这些是相关的导航属性。此用户已附加到上下文(您最初使用查询加载它),因此不会对数据库进行其他查询,因此不会延迟加载。

使用延迟加载时,如果公司A有100个用户,则companyA.user将包含100个条目(当您访问此属性时从数据库加载)。在您的情况下,即使公司A有100个用户 - companyA.user将只包含1个用户 - 您最初加载的用户。

这种行为通常很好,但在某些情况下它可能会导致麻烦 - 大多数情况下,当您想要序列化EF对象并因此而进入循环引用时会发生这种情况。

没有办法禁用我所知道的这种行为。