![](/img/trans.png)
[英]The mapping of CLR type to EDM type is ambiguous because multiple CLR types
[英]GraphQl .NET DateGraphType CLR Type Mapping Issue
从 v4-v7 升级我的 GraphQL.NET 版本后,我遇到了一个我似乎无法解决的问题。 该解决方案也在我最近升级的 .NET 7 上运行。
我试图在迁移指南中寻找解决这些错误的方法,但我一定遗漏了一些东西。 目前,我引用的 DateGraphType 也可为空的任何代码都会引发以下错误:
无法隐式派生参数“DateMutations.updateDate.value”的 GraphQL 类型。 找不到从 CLR 类型“GraphQL.Types.DateGraphType”到 GraphType 的类型映射。 您是否忘记使用“ISchema.RegisterTypeMapping”注册类型映射?
以下是现场代码的样子:
Field<BooleanGraphType>("updateDate")
.Argument<DateGraphType>("newDate", true)
.Argument<int>("id")
.Resolve()
.WithScope()
.WithService<IMediator>()
.ResolveAsync(UpdateDateResolver);
如果我删除暗示这是一个可为 null 的参数的代码片段,如下所示:
Field<BooleanGraphType>("updateDate")
.Argument<DateGraphType>("newDate")
.Argument<int>("id")
.Resolve()
.WithScope()
.WithService<IMediator>()
.ResolveAsync(UpdateDateResolver);
我的架构继续“生成”,并在架构中的其他地方找到下一个参数,该参数的类型为 DateGraphType,可空选项传入为 true。 如果未传递可空参数,则解决方案中的 arguments 中的 rest 有效。
重申一下,在我从 v4 升级之前,所有这些代码都可以正常工作,所以我认为它一定是我在迁移指南中遗漏的内容。
我想到了。 在过渡到 GraphQL v7 之后,他们将 CLR 类型添加到参数 generics 中,并通过我进行了一点循环。
使用语法时
.Argument<TGraphType>("name")
它默认为可以为空,一如既往。 要获得不可为 null 的类型,您必须执行以下操作。
.Argument<NonNullGraphType<TGraphType>("name")
但是,随着 CLR 类型的增加,它们的语法略有不同,类似于.Field(x => x, true)
的 Field 语法。 使用 CLR 类型时,您必须单独传递可空属性。 但是,CLR 类型默认为不可空。
.Argument<TClrType>("name") // defaults as nullable: false
如果您希望 CLR 类型可以为空,则必须传入额外的参数。
.Argument<TClrType>("name", true) // now it's nullable
我最终在 GitHub 回购协议中提出了这个问题作为一个问题,这里有一个链接,在这个链接中向我解释了这个问题,以防您需要更清楚的了解。
https://github.com/graphql-do.net/graphql-do.net/issues/3507
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.