我正在学习如何在 graphql-dotnet 中使用 CustomScalar。
我的表中有一个 tinyint 列,从我读过的内容来看,我应该在 C# 中的这个列上使用字节。经过研究,我发现我需要创建一个 ByteGraphType,但我在这样做时遇到了麻烦。
我从这个链接https://github.com/graphql-dotnet/graphql-dotnet/issues/458得到了 ByteGraphType 示例,所以我认为它会起作用。
使用此代码,我可以查询表,但是,我的突变不起作用。我没有找到一个示例来演示突变在字节列中的样子。我按照我的代码示例中的说明进行了尝试,但是在这一行中 (var avaliacao = context.GetArgument("avaliacao");),我的参数 avaliacao.Nota 返回 null,我不确定如何继续。
有人能帮我吗?
谢谢
那是我的密码
//模型
[Column("nota")]
public byte Nota { get; set; }
//类型
Field<ByteGraphType>("Nota", resolve: context => context.Source.Nota);
//输入类型
Field<ByteGraphType>("nota");
//询问
Field<ListGraphType<AvaliacaoType>>(
"avaliacoes",
resolve: context => contextServiceLocator.AvaliacaoRepository.All());
//突变
Field<AvaliacaoType>(
"createAvaliacao",
arguments: new QueryArguments(
new QueryArgument<NonNullGraphType<AvaliacaoInputType>> { Name = "avaliacao" }
),
resolve: context =>
{
var schema = new Schema();
schema.RegisterValueConverter(new ByteValueConverter());
var avaliacao = context.GetArgument<Avaliacao>("avaliacao");
avaliacao.Nota.AstFromValue(schema, new ByteGraphType());
return contextServiceLocator.AvaliacaoRepository.Add(avaliacao);
});
//ByteGraphType
using GraphQL.Language.AST;
using GraphQL.Types;
using System;
namespace Api.Helpers
{
public class ByteGraphType : ScalarGraphType
{
public ByteGraphType()
{
Name = "Byte";
}
public override object ParseLiteral(IValue value)
{
var byteVal = value as ByteValue;
return byteVal?.Value;
}
public override object ParseValue(object value)
{
if (value == null)
return null;
try
{
var result = Convert.ToByte(value);
return result;
}
catch (FormatException)
{
return null;
}
}
public override object Serialize(object value)
{
return ParseValue(value).ToString();
}
public class ByteValueConverter : IAstFromValueConverter
{
public bool Matches(object value, IGraphType type)
{
return value is byte;
}
public IValue Convert(object value, IGraphType type)
{
return new ByteValue((byte)value);
}
}
public class ByteValue : ValueNode<byte>
{
public ByteValue(byte value)
{
Value = value;
}
protected override bool Equals(ValueNode<byte> node)
{
return Value == node.Value;
}
}
}
}
我需要的是能够保存具有 tinyint 列的表的记录。如果我将代码中的类型更改为 int,我可以变异,但不能查询。