Entity Framework ASP.NET;HTTP POST: в теле запроса JSON есть обязательные значения DbEntityValidationException - PullRequest
0 голосов
/ 16 апреля 2019

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

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

Строка 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 , чтобы помочь мне отладить, но я не совсем уверен, что происходит не так.

Ответы [ 2 ]

0 голосов
/ 21 апреля 2019

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

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

0 голосов
/ 17 апреля 2019

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

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

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; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...