繁体   English   中英

为什么在 Linq 的 Select 方法中访问引用实体的属性时,EF Core 会自动加载相关实体?

[英]Why EF Core automatically load related entities when property referring to the entity is accessed in Select method of Linq?

当我在 Linq 的 Select 扩展方法中访问引用属性时,EF Core (5.21) 会自动加载(在 SQL 中加入)这个实体。

此测试正确通过,即意味着 EF 会自动加载该属性,而不管 context.ChangeTracker.LazyLoadingEnabled 的值如何。

我试图使引用属性不是虚拟的,它也没有帮助。

在这种情况下是否可以禁用引用属性的自动加载?

[Theory]
[InlineData(false)]
[InlineData(true)]
public void IncludingAfterSelect(bool lazyLoadingEnabled)
{
    using (var context = new MyContext(_options))
    {
        context.ChangeTracker.LazyLoadingEnabled = lazyLoadingEnabled;

        var models = context.AddrGroupsObjects.Take(1);

        var modelsList = models.ToList();
        Assert.Single(modelsList);
        Assert.Null(modelsList[0].AgoAobj);

        var dtos = models.Select(x => new AddrGroupsObjectDto()
        {
            Id = x.AgoId,
            AddrObjectId = x.AgoAobjId,
            AddrObject = x.AgoAobj == null ? null : new AddrObjectDto() { AobjId = x.AgoAobj.AobjId }
        });

        var dtosList = dtos.ToList();

        Assert.Single(dtosList);
        Assert.NotNull(dtosList[0].AddrObject);

        modelsList = models.ToList();
        Assert.Single(modelsList);
        Assert.Null(modelsList[0].AgoAobj);

    }
}

不。这不是延迟加载。 如果您明确选择实体,它们将被加载。

因为这就是EF所做的。 如果您在选择中引用相关对象或它将在何处加入它们,以便它可以获取您请求的数据; 他们不需要明确的 Include

如果没有,那么整个地方都会出现问题,因为它不会给出代码所要求的代码......除非你之前认为它就像 SQL 和 Include 等价于 Join 并且如果你不包括然后加入永远不会发生。

但是,你希望 EF 在你的情况下会做什么 - 你特别要求 x.SomeRelatedEntity.SomeProperty - EF 不应该加载它,因为它应该认识到你要求的属性在 x 中可用作为另一个结束关系并使用 x 结束值而不是远端? 或者忘记加入/包含并尝试访问相关数据会导致崩溃? 这会错过 EF 的主要卖点之一(隐藏将对象图映射到关系数据库的复杂性),并且基本上使所有代码都充满了一些类似于 SQL 不同关键字的东西,所以我们不妨使用 SQL (或者 Dapper,所以我们得到了对象映射部分)

我建议你改变一些东西,这样你就不会引用你不想加载的对象,即AddrObject = x.AgoAobj == null ? null : new AddrObjectDto() { AobjId = x.AgoAobjId } AddrObject = x.AgoAobj == null ? null : new AddrObjectDto() { AobjId = x.AgoAobjId } - 或者完全省略这一行。 在查询结束后,您可以从 AddrObjectId ID 的值是否为 null 来计算出如何完全处理 AddrObject 属性

暂无
暂无

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

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