context.GetArgument (), возвращающий нуль с ByteGraphType - PullRequest
1 голос
/ 29 марта 2019

Я учусь использовать CustomScalar в graphql-dotnet.

В моей таблице есть столбец tinyint, и из того, что я прочитал, я должен использовать байт для этого столбца в C #. После исследования я обнаружил, что мне нужно создать ByteGraphType, но у меня возникают проблемы с этим.

Я получил пример ByteGraphType по этой ссылке https://github.com/graphql-dotnet/graphql-dotnet/issues/458,, поэтому я думаю, что он будет работать.

С помощью этого кода я могу запросить таблицу, однако моя мутация не работает. Я не нашел пример, чтобы продемонстрировать, как мутация будет выглядеть с байтовым столбцом. Я попытался, как указано в моем примере кода, но в этой строке (var avaliacao = context.GetArgument ("avaliacao");) мой аргумент avaliacao.Nota возвращает ноль, и я не уверен, что делать дальше.

Может ли кто-нибудь мне помочь?

Спасибо

ЭТО МОЙ КОД

// * Модель 1017 *

[Column("nota")]
public byte Nota { get; set; }

// * Тип 1020 *

Field<ByteGraphType>("Nota", resolve: context => context.Source.Nota);   

// InputType

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, я могу изменить его, но не смогу выполнить запрос.

1 Ответ

1 голос
/ 01 апреля 2019

Я изменил свой CustomScalar, и он работал:

using GraphQL.Language.AST;
using GraphQL.Types;
using System;

namespace Api.Helpers
{
    public class ByteGraphType : ScalarGraphType
    {
        public ByteGraphType()
        {
            Name = "Byte";
            Description = "ByteGraphType";
        }

        /// <inheritdoc />
        public override object Serialize(object value)
        {
            return ParseValue(value).ToString();
        }

        /// <inheritdoc />
        public override object ParseValue(object value)
        {
            byte result;
            if (byte.TryParse(value?.ToString() ?? string.Empty, out result))
            {
                return result;
            }

            return null;
        }

        /// <inheritdoc />
        public override object ParseLiteral(IValue value)
        {
            if (value is StringValue)
            {
                return ParseValue(((StringValue)value).Value);
            }

            return null;
        }
    }
}

...