繁体   English   中英

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

[英]Entity Framework lazy loading incorrect entity

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

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; }
}

在我的映射器中,我可以将User设置为罚款,但是只要执行以下代码(在数据库中保留所有更改之前),就可以

if (teamMembers.Select(x => x.User).Contains(currentUser))

其中teamMembers是TeamMembers的列表,currentUser是从Db加载的User实体,然后Answer的User属性设置为数据库中的上一个值。 我的理解是,由于尚未从数据库中加载Answer的User属性,因此尚未访问,这就是发生的情况(已被延迟加载?)。

我可以通过甚至在映射器中设置User之前通过阅读User来修复它,但是我不明白的是为什么当我访问TeamMember的User属性时,会加载并设置Answer的User属性? 这是预期的行为,因为这两个实体都与同一用户关联(即,在数据库中,它们具有与外键相同的User_Id),并且在为TeamMembers加载它时,EF试图变得聪明并填充引用该实体且没有该实体的其他实体。还没有加载吗?

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

通过teamMembers引用加载该用户后,该文件已加载...期。 当您从另一个元素/对象中引用它时,如果它已经在内存中有该对象,那么再次去加载它是很愚蠢的。

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

参考: https : //msdn.microsoft.com/zh-cn/data/hh949853.aspx#3

“ ...... ObjectContext将检查具有相同键的实体是否已经加载到其ObjectStateManager中。如果已经存在具有相同键的实体,则EF会将其包括在查询结果中。尽管EF仍会发出查询数据库,这种行为可以绕开多次实体化的大量成本。”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM