什么会自动导致EF Core包含Collection属性?

问题描述 投票:2回答:1

我有这门课:

public class Subject
{
    public int Id { get; set; }

    [Required]
    [StringLength(50)]
    public string Name { get; set; }

    [StringLength(50)]
    public string Code { get; set; }

    public int LevelId { get; set; }
    public int? ParentId { get; set; }
    public int Order { get; set; }

    [ForeignKey("LevelId")]
    public Level Level { get; set; }

    [ForeignKey("ParentId")]
    public Subject Parent { get; set; }

    public ICollection<Subject> Children { get; set; }

    [Column(TypeName = "datetime2")]
    public DateTime? DeletedAt { get; set; }
}

然后我有这两个存储库方法:

public Subject GetById(int subjectId)
{
    var subjectFound = _context.Subjects.Where(subj => subj.Id == subjectId)
        .SingleOrDefault();
    var subject = _mapper.Map<Subject>(subjectFound);
    if (subjectFound != null)
    {
        subject.Children = GetChildren(subject.Id).ToList();
    }
    return subject;
}

public void Update(Subject existingSubject)
{
    var subjectToUpdate = _context.Subjects.Where(subj => subj.Id == existingSubject.Id)
        .SingleOrDefault();
    if (subjectToUpdate != null)
    {
        _mapper.Map(existingSubject, subjectToUpdate);
        _context.Update(subjectToUpdate);

        SaveChildren(subjectToUpdate.Id, existingSubject.LevelId, existingSubject.Children);

        _context.SaveChanges();
    }
}

如果查看这两种方法的LINQ语句,它们在where子句中只是不同的变量名,但它们具有相同的值,正在搜索Id。

现在正在发生的是第一个方法(GetById),在LINQ查询之后,Children为null,因为我在其中有一个GetChildren调用。

但是在第二种方法(Update)中,在LINQ查询之后,返回的对象具有其所有Children。它们是相同的查询,我一遍又一遍地检查,以确保它们具有相同的值,他们这样做。

在调用这些2之前,我没有任何特殊的先前代码;它们只是正常调用。所以我对这种行为感到很困惑。可能是什么导致了这个?

c# asp.net-core entity-framework-core ef-core-2.0
1个回答
2
投票

首先,EF Core永远不会自动包含相关实体。 EF Core不支持延迟加载,因此所有相关实体必须急切加载(通过Include)或明确加载(Load)。

也就是说,EF中的DbContext维护一个对象图,并且在查询对象时,它们会保留在该图中。一旦孩子们被加载一次,EF就可以再次从图中重新建立那些相关实体,而不必查询数据库,这可能就是你在这里看到的。然而,这不是你应该依赖的东西,因为它非常受欢迎。你基本上很幸运,方法是按照某种顺序调用的。最好假设事情不会存在并采取相应的行动。如果EF不需要实际发出查询来实现它,那很好,但是如果必要的话应该赋予它权力。

© www.soinside.com 2019 - 2024. All rights reserved.