代码之家  ›  专栏  ›  技术社区  ›  Paritosh

EF Core为什么要返回相关属性

  •  2
  • Paritosh  · 技术社区  · 6 月前

    我们正在为一个项目使用实体框架核心2.1.14。当我尝试下面显示的两个语句时,生成的SQL不同,但都返回了相关的属性。

    A. HouseholdMmbrPrflhas a 1:M关系 HouseholdMemberIncomes :

    var test1 = await _dbContext.HouseholdMmbrPrfl
                                .Where(x => x.HouseholdMemberProfileId == memberId)
                                .FirstOrDefaultAsync();
    
    var test2 = await _dbContext.HouseholdMmbrPrfl
                                .Include(x => x.HouseholdMemberIncomes)
                                .Where(x => x.HouseholdMemberProfileId == memberId)
                                .FirstOrDefaultAsync();
    

    我以为 .Include 需要得到 家庭成员收入 ,但每当我查看test1时,我都会看到 家庭成员收入 在对象中填充,展开对象,我看到了详细信息,但在调试控制台中没有看到另一个SQL查询。

    我将查询输出为:

    .UseLoggerFactory(LoggerFactory.Create(builder => builder.AddDebug())
    

    我想 test1 不会有 家庭成员收入 在那里。查询 测试1 仅在查询 HouseholdMmbrPrfl 表中,查询为 test2 我看到运行了2次查询 家庭MmbrPrfl 第二次反对 家庭成员收入

    你什么时候需要 .包括 如果在任何一种情况下数据都存在,我都认为是延迟加载属性,但我找不到它已启用(否 UseLazyLoadingProxies )并且该财产不是虚拟的。

    public List<HouseholdMemberIncome> HouseholdMemberIncomes { get; set; }
    
    1 回复  |  直到 6 月前
        1
  •  2
  •   Guru Stron    6 月前

    我假设它是延迟加载属性,但我找不到它已启用(没有UseLazyLoadingProxies),并且该属性不是虚拟的。

    由于它不是延迟加载的,这是由于关系修复而发生的(具体请参见 Fixup to locally tracked entities 文档的一部分和那里提供的查看示例):

    关系修复也发生在从跟踪查询返回的实体和已被跟踪的实体之间 DbContext .

    基本上,如果实体已经通过“当前”上下文实例被某个查询获取(并且启用了跟踪),那么当以下查询返回时,相关实体将填充相应的导航。

    如果在任何一种情况下都有数据,你什么时候需要包含

    因为它可能纯粹是间接的(如果你之前没有加载所有需要的实体,而只是加载了其中的一些,那么它甚至是完全错误的)。例如,如果你删除了之前获取相关数据的代码,那么你的代码就会崩溃。