EntityFramework 6 数据库优先模式禁用延迟加载

3
如何禁用所有图片懒加载
从数据库生成模型之后,我有以下代码
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)

1个回答

4
这不是懒加载,而是一种称为关系修正的不同概念。简而言之,它只是保持导航属性相互同步。在您的情况下,您有user.company导航属性和company.user集合导航属性。您加载了用户和公司,并将它们附加到上下文中。现在,在某些时刻(可以在此处找到此类点的列表here),EF执行关系修复。在这种情况下,查询执行后发生。EF确保如果设置了user.company,则company.user集合应该包含该user,因为这些是相关的导航属性。这个用户已经附加到上下文中(最初使用查询加载),因此不会向数据库发出其他查询,因此它不是懒加载。
使用懒加载,如果您有100个公司A的用户,则companyA.user将包含100个条目(在访问此属性时从数据库加载)。在您的情况下,即使公司A有100个用户,companyA.user也将仅包含一个用户-您最初加载的那个用户。
这种行为通常很好,但在某些情况下可能会引起麻烦-最常见的情况是当您想序列化EF对象并因此进入循环引用时。
据我所知,没有办法禁用这种行为。

是的,在JSON序列化中最大的问题就是这个。当我使用CodeFirst时,我不使用虚拟属性,EF也不会加载任何(未被我包含的)属性。也许在DataBase First中,我可以禁用某些属性的虚拟化? - Alexandr Sulimov
1
问题在于虚拟属性与此行为无关。您还禁用了代理创建,因此根本不会创建代理。至于序列化-大多数序列化程序可以处理循环引用,并且不会因堆栈溢出而失败。 - Evk
user.company 不重要 - EF 使用外键进行关系修复。即使您通过两个不同的查询加载 usercompany - 它们之间的关系也将建立。 - Pavel Mayorov
@PavelMayorov 这是真的,只是在这个特定的例子中,我们只有这两个属性 - user.companycompany.user - Evk
@PavelMayorov 但我没有在任何地方说代理创建是相关的。相反,我在上面的评论中说它与此无关。 - Evk
@Evk 抱歉,我误解了你的评论。 - Pavel Mayorov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接