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
相关产品推荐
相关产品推荐

