如何让Hot Chocolate强制获取父对象ID供对象扩展方法使用?
解决Hot Chocolate中无论客户端是否请求Id都确保加载该属性的问题
你遇到的问题本质是Hot Chocolate的字段按需加载特性:默认情况下,框架只会实例化并填充客户端查询中明确请求的字段。当客户端没请求Id时,User对象的Id属性会处于未赋值状态,导致GetData方法无法正确拼接文件名。
下面提供两种直接有效的解决方式:
方法一:在User类型配置中强制包含Id字段
通过Fluent API配置User的类型描述,标记Id字段为始终包含,无论客户端是否在查询中指定该字段。
public class UserType : ObjectType<User> { protected override void Configure(IObjectTypeDescriptor<User> descriptor) { // 强制Id字段始终被加载,不受客户端查询影响 descriptor.Field(u => u.Id) .IsRequired() .AlwaysInclude(); } }
这个方法的核心是AlwaysInclude()方法,它会告诉Hot Chocolate:解析User对象时必须填充该字段,忽略客户端的字段选择。
方法二:在GetData方法中直接获取Id(适用于数据源可直接查询的场景)
如果你的User实例来自数据库或其他可查询数据源,也可以在GetData方法中绕过父对象的Id属性,直接通过数据源获取对应的Id值。比如假设你有用户存储的上下文:
public async Task<string?> GetData([Parent] User user, [Service] IUserRepository userRepo, CancellationToken cancellationToken) { // 直接从数据源获取用户Id,避免依赖父对象的已加载字段 var userId = await userRepo.GetUserIdByUser(user, cancellationToken); return await this.readerWriter.Read($"{userId:D}.json", cancellationToken).ConfigureAwait(false); }
不过这种方法不如第一种直接,除非你的业务场景需要额外的数据源交互。
验证效果
配置完成后,即使客户端发送不包含Id字段的查询(比如仅请求data字段),Hot Chocolate也会自动填充User对象的Id属性,GetData方法就能正常读取对应文件的内容。
内容的提问来源于stack exchange,提问作者Sven Erik
相关产品推荐
相关产品推荐

