当前位置: 首页 > 知识库问答 >
问题:

实体框架延迟加载不正确的实体

淳于博文
2023-03-14

考虑以下(非常简化的)实体:

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class Answer
{
    public int Id { get;set; }
    public virtual User User { get; set; }
    public string Text { get;set }
}

public class TeamMember
{
    public int Id { get;set; }
    public virtual User User { get; set; }  
    public string Role { get; set; }
}

在我的映射器中,我可以设置用户罚款,但是一旦执行以下代码(在数据库中保留任何更改之前)

if(团队成员)。选择(x=

如果teamMembers是teamMembers的列表,currentUser是从Db加载的用户实体,则Answer的用户属性设置为数据库中的前一个值。我的理解是,因为在还没有从数据库加载Answer之前,我还没有访问它的User属性,所以发生了这样的事情(它是延迟加载的?)。

在映射器中设置之前,我可以通过读取用户来修复它,但我无法理解的是,为什么当我访问TeamMember的用户属性时,会加载并设置Answer的用户属性?由于两个实体都与同一用户关联(即,在数据库中,它们具有与外键相同的用户Id),并且在为团队成员加载它时,EF会尝试巧妙地填充引用它但尚未加载的其他实体,因此这是预期的行为吗?


共有1个答案

洪念
2023-03-14

实体不是由引用它们的元素存储/缓存的,而是与各自的集合一起存储的。

一旦你加载了该用户通过团队成员引用,它被加载...周期。当您从另一个元素/对象引用它时,如果它在内存中已经有了该对象,再去加载它将是愚蠢的。

这一切都是出于设计,它是有意义的。。。例如,如果您希望同时保存所有这些对象,它将首先创建用户,为其获取标识/密钥,然后使用生成的密钥保存引用该用户的其他对象。

裁判:https://msdn.microsoft.com/en-us/data/hh949853.aspx#3

“…ObjectContext将检查是否已将具有相同键的实体加载到其ObjectStateManager中。如果已存在具有相同键的实体,EF将在查询结果中包含该实体。尽管EF仍将对数据库发出查询,但此行为可以绕过实体实体实体化的大部分成本。”多次。”

 类似资料:
  • 我从这个网站上读到了关于懒惰加载的内容。启用或禁用LazyLoding “如果我们请求已启用LazyLoading的学生列表,数据提供程序将从数据库中获取所有学生,但每个StudentAddress属性在显式访问该属性之前不会加载。” 此语句表示,当我将设置为true时,将不会加载相关数据。然而 如果我设置延迟加载启用=true,上面的代码返回所有特技与他们的老师和地址。我在这里错过了什么?有人能

  • 我正在使用启用延迟加载的实体框架5。我有以下代码: 但这有意义吗?我想确保公共属性订阅从不为null。由于虚拟实体框架覆盖了getter和setter以提供延迟加载功能。 我需要这个字段还是我可以只使用一个自动属性,如果没有订阅,我得到一个空列表?

  • 当将实体模型转换为DTO时,我对Entity Framework Core(v2.0.1)有一个问题。基本上,通过该短语的任何其他版本,当我不想加载时,它是延迟加载的。这是一个简单的。NET Core Console应用程序(带有Microsoft. EntityFrameworkCore. SqlServer(2.0.1)包)。 现在,当执行方法来检索数据时,它正在执行以下SQL 如您所见,它没

  • 我在亲子关系中有几个实体:家庭(父母)和更新(孩子)。我想阅读没有相应更新的家庭列表。只有17个家庭,但大约有60,000个更新,所以我真的不想要更新。 我使用EntiesToDTO从Family实体生成DTO,并创建一个汇编器来将Family实体转换为FamilyDTO。汇编器的ToDTO方法如下所示: 当我运行汇编程序时,我发现每个生成的FamilyDTO都填充了Updates\u ID列表,

  • 我正在使用模型映射器(http://modelmapper.org/)将具有延迟加载对象列表(通过Hibernate)的实体映射到具有modelmapper.map()的DTO。 输出dto的列表为空值,但实体的列表已填充。当我改为“急切加载”时,一切正常,但我的查询太大,所以这不是一个选项。 有人知道模型映射器如何映射代理的Hibernate实体类吗? 这是我的父实体: 运输署署长: 这是我如何

  • 我已经将读上下文和写上下文分开了,现在我将在默认情况下在ReadOnlyContext中启用LazyLoading。我也使用了下面的方法,但不幸的是它不起作用。 我的模型: 我的ef版本: EntityFramework核心版本2.1.2 我得到了这个错误: “为警告‘Microsoft.EntityFrameworkCore.Infrastructure.DetachedLazyLoadingW