.NET 6 WebApi中GraphQL自动包含主键Id生成Guid的方案
自动包含主键生成Guid并隐藏主键的解决方案
最简单实现:使用HotChocolate的[Computed]特性
这是最直接的方案,通过标记计算字段的依赖,让GraphQL自动包含所需的主键字段,同时隐藏主键避免被客户端查询。
步骤1:修改实体类
给Guid字段添加[Computed]特性,指定依赖Id;给Id字段添加[GraphQLIgnore]禁止客户端查询:
using System.ComponentModel.DataAnnotations; using HotChocolate; namespace Soly.Data { public class Profiles { [Key] [GraphQLIgnore] // 禁止客户端查询主键Id public int Id { get; set; } = 0; [Computed(Dependencies = new[] { nameof(Id) })] // 标记Guid依赖Id字段 public string? Guid { get { return this.Id.ToString(); /* string salt = "Z1@#!Q"; using(MD5 md5 = MD5.Create()) { byte[] hash = md5.ComputeHash(Encoding.UTF8.GetBytes(salt + this.Id.ToString())); return new Guid(hash).ToString(); }*/ } } } }
步骤2:启用GraphQL投影
在Program.cs的GraphQL配置中启用投影功能([Computed]特性依赖投影):
var builder = WebApplication.CreateBuilder(args); // 添加DbContext等服务... // 配置GraphQL builder.Services.AddGraphQLServer() .AddQueryType<Query>() // 你的查询类型 .AddProjections() // 必须启用投影 .AddType<Profiles>(); // 注册Profiles实体类型 var app = builder.Build(); // 其他中间件配置... app.MapGraphQL(); app.Run();
配置完成后效果:
- 客户端无法查询
Id字段,避免主键被遍历 - 当客户端查询
Guid时,HotChocolate会自动在EF Core的查询中包含Id字段,确保Guid能正常生成
备选方案:自定义GraphQL类型配置
如果需要更精细的控制,可以自定义实体的GraphQL类型,强制包含主键并隐藏:
步骤1:创建自定义类型
using HotChocolate.Types; using Soly.Data; public class ProfilesType : ObjectType<Profiles> { protected override void Configure(IObjectTypeDescriptor<Profiles> descriptor) { // 隐藏Id字段,禁止客户端查询 descriptor.Field(p => p.Id).Ignore(); // 配置Guid字段,强制解析时获取Id,同时确保EF查询包含Id descriptor.Field(p => p.Guid) .Resolve(context => { var profile = context.Parent<Profiles>(); return profile.Id.ToString(); }) .UseProjection(); // 启用投影,确保EF查询包含Id } }
步骤2:注册自定义类型
在Program.cs中替换默认类型注册:
builder.Services.AddGraphQLServer() .AddQueryType<Query>() .AddProjections() .AddType<ProfilesType>(); // 注册自定义类型
内容的提问来源于stack exchange,提问作者THE AMAZING
相关产品推荐
相关产品推荐

