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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 14:05:28