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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 07:25:31