Entity Framework ASP.NET; HTTP POST: обязательные значения существуют в теле запроса JSON DbEntityValidationException

Я пытаюсь отправить некоторые данные через мой API веб-службы ASP.NET, но он выдает исключение DbEntityValidationException, когда я пытаюсь опубликовать строку JSON. Где я ошибаюсь, пытаясь опубликовать свою строку JSON?

Я использовал блок кода это, чтобы помочь мне отладить мою проблему, но он говорит мне, что мои поля обязательны, когда они существуют в строке JSON, почти обрабатывая строку так, как будто ее никогда не существовало. Это позволяет мне узнать, имеет ли тело запроса значение null, но независимо от пар "имя-значение" оно по-прежнему сообщает мне, что поля являются обязательными.

Строка JSON, которую я пытаюсь опубликовать, в значительной степени скопирована со страницы справки.

{
  "CUSTOMER_ID": 7.0,
  "CUSTOMER_USERNAME": "sample string 2",
  "CUSTOMER_PASSWORD": "sample string 3",
  "CUSTOMER_NAME": "sample string 4",
  "CUSTOMER_EMAIL": "sample string 5"
}

и ответ, который я получаю,

Response: 500

"Message": "An error has occurred.",
"ExceptionMessage": "Validation failed for one or more entities. See 'EntityValidationErrors' property for more details. The validation errors are: CUSTOMER.CUSTOMER_USERNAME: The CUSTOMER_USERNAME field is required.; CUSTOMER.CUSTOMER_PASSWORD: The CUSTOMER_PASSWORD field is required.; CUSTOMER.CUSTOMER_NAME: The CUSTOMER_NAME field is required.; CUSTOMER.CUSTOMER_EMAIL: The CUSTOMER_EMAIL field is required.",
"ExceptionType": "System.Data.Entity.Validation.DbEntityValidationException"
"StackTrace": "   at WebAPI.Models.Entities3.SaveChangesAsync() in C:\\Users\\[username]\\Desktop\\[folder]\\WebAPI\\WebAPI\\WebAPI\\Models\\Model1.Context.cs:line 65\r\n   at WebAPI.Controllers.CUSTOMERsController.<PostCUSTOMER>d__4.MoveNext() in C:\\Users\\[user]\\Desktop\\[folder]\\WebAPI\\WebAPI\\WebAPI\\Controllers\\CUSTOMERsController.cs:line 88\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Threading.Tasks.TaskHelpersExtensions.<CastToObject>d__1`1.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__1.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__5.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__15.MoveNext()"

API использует следующий метод через контроллер и модель для публикации строки.

// POST: api/CUSTOMERs
        [ResponseType(typeof(CUSTOMER))]
        public async Task<IHttpActionResult> PostCUSTOMER(CUSTOMER cUSTOMER)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            db.CUSTOMERs.Add(cUSTOMER);

            try
            {
                await db.SaveChangesAsync();
            }
            catch (DbUpdateException)
            {
                if (CUSTOMERExists(cUSTOMER.CUSTOMER_ID))
                {
                    return Conflict();
                }
                else
                {
                    throw;
                }
            }

            return CreatedAtRoute("DefaultApi", new { id = cUSTOMER.CUSTOMER_ID }, cUSTOMER);
        }

=============================================================================

namespace WebAPI.Models
{
    using System;
    using System.Collections.Generic;

    public partial class CUSTOMER
    {
        public decimal CUSTOMER_ID { get; set; }
        public string CUSTOMER_USERNAME { get; set; }
        public string CUSTOMER_PASSWORD { get; set; }
        public string CUSTOMER_NAME { get; set; }
        public string CUSTOMER_EMAIL { get; set; }
    }
}

Заголовки в порядке, так как я использую apirequest.io для отладки, но я не совсем уверен, что происходит не так.

Попробуйте добавить [FromBody] вот так: public async Task<IHttpActionResult> PostCUSTOMER([FromBody] CUSTOMER cUSTOMER)

Mohsin Mehmood 17.04.2019 04:38
Стоит ли изучать 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
1
430
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Попробуйте отделить модель объекта от контроллера.

Создайте реплику модели для модели объекта и проверьте, как показано ниже:

public async Task<IHttpActionResult> PostCUSTOMER(CUSTOMERDTO dto)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        if (dto != null)
        {
            CUSTOMER cust = new CUSTOMER();
            //write code to assign dto to cust object
            db.CUSTOMERs.Add(cust);
        }

        try
        {
            await db.SaveChangesAsync();
        }
        catch (DbUpdateException)
        {
            if (CUSTOMERExists(dto.CUSTOMER_ID))
            {
                return Conflict();
            }
            else
            {
                throw;
            }
        }

        return CreatedAtRoute("DefaultApi", new { id = dto.CUSTOMER_ID }, dto);
    }




 public class CUSTOMERDTO
{
    public decimal CUSTOMER_ID { `enter code here`get; set; }
    public string CUSTOMER_USERNAME { get; set; }
    public string CUSTOMER_PASSWORD { get; set; }
    public string CUSTOMER_NAME { get; set; }
    public string CUSTOMER_EMAIL { get; set; }
}
Ответ принят как подходящий

Я неизбежно понял это, запросы, сделанные из apirequest.io, перезаписывались заголовком application/x-www-form-urlencoded. Переключение на Postman помогло мне протестировать вызовы API.

Всегда дважды проверяйте сетевые инструменты Chrome или Firefox.

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