【问题标题】:Confusion over "IObjectFieldDescriptor.Type" in documentation对文档中的“IObjectFieldDescriptor.Type”感到困惑
【发布时间】:2020-11-26 10:53:03
【问题描述】:

我只是想建立一些基本的例子。 我想“代码优先”,我需要 C# 编译器告诉我哪里出错了。

如果我看 https://chillicream.com/docs/hotchocolate/v10/schema/object-type/

有一个例子

type Person {
  id: Int!
  name: String!
  friends: [Person]
}

据称是这段 C# 代码的结果

public class PersonType
    : ObjectType<Person>
{
    protected override void Configure(IObjectTypeDescriptor<Person> descriptor)
    {
        descriptor.Field(t => t.Name).Type<NonNullType<StringType>>();
        descriptor.Field("friends")
            .Type<ListType<NonNullType<StringType>>>()
            .Resolver(context =>
                context.Service<IPersonRepository>().GetFriends(
                    context.Parent<Person>().Id));
    }
}

好的,所以 id 丢失了,但文档继续解释说热巧克力会填补空白(我不喜欢这种东西......但把它放在一边)。 然后我们有“name”,它是一个字符串,这似乎对应于

.Type<NonNullType<StringType>>()

好吧,那是可信的,“朋友”虽然看起来很奇怪。 “类型”是

.Type<ListType<NonNullType<StringType>>>()

我期望的东西更明显映射到“[Person]”

文档错了吗?还是我的理解有误?

【问题讨论】:

    标签: hotchocolate


    【解决方案1】:

    首先,是的,那里的文档是错误的。 将在此 PR 中修复:https://github.com/ChilliCream/hotchocolate/pull/2890

    正确的代码是

    public class PersonType
        : ObjectType<Person>
    {
        protected override void Configure(IObjectTypeDescriptor<Person> descriptor)
        {
            descriptor.Field(t => t.Name).Type<NonNullType<StringType>>();
            descriptor.Field("friends")
                .Type<ListType<NonNullType<PersonType>>>()
                .Resolver(context =>
                    context.Service<IPersonRepository>().GetFriends(
                        context.Parent<Person>().Id));
        }
    }
    

    好的,所以 id 丢失了,但文档继续解释说热巧克力会填补空白(我不喜欢这种东西......但把它放在一边)。

    如果您不喜欢它,您可以部分关闭它。如果未设置,HotChocolate 将始终尝试从 .NET 推断类型。 但是,如果您想禁用属性推断,您可以通过两种方式执行此操作。

    1. 全局禁用它
    schemaBuilder.ModifyOptions(x => x.DefaultBindingBehavior = BindingBehavior.Explicit)
    
    
    1. 按类型禁用
    public class PersonType
        : ObjectType<Person>
    {
        protected override void Configure(IObjectTypeDescriptor<Person> descriptor)
        {
             descriptor.BindFieldsExplicitly();
        }
    }
    

    【讨论】:

    • 对不起,我太厚脸皮了,我又回到了这个问题,但现在我想使用 oracle,这意味着我需要 dotnet 3.1,我认为这意味着我需要热巧克力 10?你知道 EF 和热巧克力 10 有什么好的吗?...我真的很挣扎。
    • 我基本上是在对其进行评估,我有 2 个可能的用例,但是这个,我只想搭建一个 oracle 数据库,并希望通过自反机制公开它,所以我希望几乎 0 热巧克力代码。
    • HotChocolate 11 也适用于 netcoreapp 3.1 :)
    • 啊...当我使用 11 时,我遇到了某种版本冲突,也许我会再去发布错误。
    • 你是完全正确的,我已经升级到 11,并且 dotnet 5 并且一切正常,tbh,它似乎导致我的版本控制问题的 oracle 库,它们似乎是 12 个月或更多落后于最新的 EF 版本
    猜你喜欢
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    相关资源
    最近更新 更多