Context.GetArgument() возвращает null с ByteGraphType

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

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

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

С помощью этого кода я могу запросить таблицу, однако моя мутация не работает. Я не нашел примера, демонстрирующего, как будет выглядеть мутация с байтовым столбцом. Я попытался, как указано в моем примере кода, но в этой строке (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, я смогу изменить его, но не смогу выполнить запрос.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
638
1

Ответы 1

Я изменил свой 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;
        }
    }
}

Другие вопросы по теме