You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core中Entity Framework如何关联多张子表数据?

问题描述

以下是通过外键约束关联的三张表结构:

CREATE TABLE "EMPLOYER_TYPE" 
(   
    "ID" NUMBER(5, 0) GENERATED ALWAYS AS IDENTITY MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER  NOCYCLE  NOKEEP  NOSCALE  NOT NULL ENABLE, 
    "CODE" NVARCHAR2(5), 
    "DESCRIPTION" NVARCHAR2(150),
    "IS_ACTIVE" NUMBER(1,0) DEFAULT 1
);
       
CREATE TABLE "EMPLOYER_TYPE_DETAILS" 
(   
    "ID" NUMBER(10,0) GENERATED ALWAYS AS IDENTITY MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER  NOCYCLE  NOKEEP  NOSCALE  NOT NULL ENABLE, 
    "EMPLOYER_TYPE_ID" NUMBER(5,0), 
    "EMPLOYER_COMPANY_NAME" NVARCHAR2(100), 
    "EMPLOYER_CONTACT" NVARCHAR2(20), 
    "ADDITIONAL_INFORMATION" NVARCHAR2(100), 
    "IS_ACTIVE" NUMBER(1,0) DEFAULT 1, 
    "EMPLOYER_CITY" VARCHAR2(100 BYTE), 

    CONSTRAINT "EMPLOYER_TYPE_DETAILS_EMPLOYER_TYPE_FK" 
        FOREIGN KEY ("EMPLOYER_TYPE_ID")
            REFERENCES "EMPLOYER_TYPE" ("ID") ENABLE
);
       
CREATE TABLE "EMPLOYER_SOLUTION_DETAIL" 
(   
    "ID" NUMBER(19,0) GENERATED ALWAYS AS IDENTITY MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER  NOCYCLE  NOKEEP  NOSCALE  NOT NULL ENABLE, 
    "PROPOSAL_ID" NUMBER(19,0), 
    "EMPLOYER_TYPE_ID" NUMBER(5,0), 
    "EMPLOYER_TYPE_DETAIL_ID" NUMBER(10,0), 
    "EMPLOYER_NUMBER" NUMBER(10,0), 
         
    CONSTRAINT "EMPLOYER_SOLUTION_DETAIL_EMPLOYER_TYPE" 
        FOREIGN KEY ("EMPLOYER_TYPE_ID")
            REFERENCES "EMPLOYER_TYPE" ("ID") ENABLE, 
    CONSTRAINT "EMPLOYER_SOLUTION_DETAIL_EMPLOYER_TYPE_DETAILS" 
        FOREIGN KEY ("EMPLOYER_TYPE_DETAIL_ID")
            REFERENCES "EMPLOYER_TYPE_DETAILS" ("ID") ENABLE
);

我正在使用ASP.NET Core和Entity Framework,当前代码如下:

return await context.EmployerSolutionDetails
                    .ThenInclude(s => s.EmployerType)
                    // here I need to include EmployerTypeDetails also
                   .AsSplitQuery()
                   .IgnoreAutoIncludes()
                   .ToListAsync(cancellationToken);

其中EmployerSolutionDetails关联了EmployerType和EmployerTypeDetails两张子表,目前已能获取EmployerType的数据,请问如何同时获取EmployerTypeDetails的数据?


解决方案

注意:你的原代码遗漏了初始的Include方法,EF Core中需要先通过Include指定要加载的直接导航属性,再用ThenInclude加载嵌套关联。针对你的需求,分两种场景处理:

场景1:加载EmployerSolutionDetails直接关联的EmployerTypeDetails

EmployerSolutionDetails与EmployerTypeDetails是直接关联(外键EMPLOYER_TYPE_DETAIL_ID),只需添加一个额外的Include方法即可:

return await context.EmployerSolutionDetails
                    .Include(s => s.EmployerType) // 加载关联的EmployerType
                    .Include(s => s.EmployerTypeDetails) // 加载关联的EmployerTypeDetails
                    .AsSplitQuery()
                    .IgnoreAutoIncludes()
                    .ToListAsync(cancellationToken);

场景2:同时加载EmployerType下的所有EmployerTypeDetails集合

如果你的EmployerType实体定义了一对多的EmployerTypeDetails集合导航属性,需要同时加载这部分数据,可以结合ThenInclude:

return await context.EmployerSolutionDetails
                    .Include(s => s.EmployerType)
                        .ThenInclude(t => t.EmployerTypeDetails) // 加载当前EmployerType对应的所有EmployerTypeDetails
                    .Include(s => s.EmployerTypeDetails) // 加载当前EmployerSolutionDetails直接关联的EmployerTypeDetails
                    .AsSplitQuery()
                    .IgnoreAutoIncludes()
                    .ToListAsync(cancellationToken);

根据你的表结构描述,场景1的写法就能满足获取EmployerSolutionDetails自身关联的EmployerTypeDetails数据的需求。


内容的提问来源于stack exchange,提问作者soorya kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 03:16:19