c# - EntityFramework 6 DatabaseFirst 禁用延迟加载

标签 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();

我不想加载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/

相关文章:

c# - 使用 Windows 应用商店应用程序设置 SendGrid

c# - 如何阻止 ReSharper 在分配的变量和链式方法调用之间插入不必要的换行符

c# - 短暂延迟后消息框自动关闭

c# - 单击 CheckBoxList 上的特定项目时如何调用事件?

c# - .NET TransactionScope 和 MSDTC

c# - 必需属性但可为空, Entity Framework 通过 Code First

c# - 为什么我不能将类库与 Asp.Net 5 MVC 6 项目中的 EF 6.1.3 一起使用

c# - DataGridView 选中行到DataTable

c# - 批量更新数据库的最快方法?

c# - 如何在 Linq 中使用 GroupBy 方法后选择新模型列表?