.NET使用Hot Chocolate 12.3.2搭建GraphQL API无schema加载问题求助
问题核心原因
你的配置存在两处关键问题导致Schema无法正常加载:
- 原始服务配置重复注册了两次GraphQL服务,第一次调用
AddGraphQLServer后又额外调用了两次AddGraphQL,手动创建Schema的逻辑和Hot Chocolate默认的服务注册逻辑冲突,导致Schema没有正确生成。 - Query类中使用了静态的ApplicationContext实例,但你注册的是WeVoteContext的池化工厂,上下文类型不匹配,同时静态DbContext存在线程安全问题,也会干扰Schema的初始化扫描。
修复方案
1. 修正服务注册
完全移除重复的GraphQL注册逻辑,Hot Chocolate 12+ 只需要通过AddGraphQLServer链式配置即可,同时内置了DateOnly类型支持,不需要手动写类型转换器:
public void ConfigureServices(IServiceCollection services) { // 注意这里要注册你实际使用的ApplicationContext,不要写错为WeVoteContext services.AddPooledDbContextFactory<ApplicationContext>(b => b.UseInMemoryDatabase("Test")); services.AddGraphQLServer() .AddQueryType<Query>() // 启用内置DateOnly支持 .AddDateOnlyType() .AddType<BillType>(); }
2. 修正Query类的DbContext使用
不要使用静态DbContext,改为通过构造函数注入上下文工厂,保证线程安全,同时匹配你注册的服务:
namespace Application { public class Query { private readonly IDbContextFactory<ApplicationContext> _dbFactory; public Query(IDbContextFactory<ApplicationContext> dbFactory) { _dbFactory = dbFactory; } public IEnumerable<LegiscanModelBill> GetBills(int N) { using var context = _dbFactory.CreateDbContext(); return context.LegiscanModelBills.Take(N).ToList(); } } }
3. 可选优化
如果你的BillType是空实现,完全可以删除这个类,Hot Chocolate会自动根据LegiscanModelBill的定义生成对应的GraphQL类型,不需要手动声明。
验证
启动项目后访问/graphql端点打开CakePop,点击界面上的刷新Schema按钮,即可正常看到所有查询字段和类型定义。
内容的提问来源于stack exchange,提问作者Antarr Byrd
相关产品推荐
相关产品推荐

