繁体   English   中英

实体框架ASP.NET; HTTP POST:JSON请求正文DbEntityValidationException中存在必需的值

[英]Entity Framework ASP.NET; HTTP POST: required values exist in JSON request body DbEntityValidationException

我正在尝试通过我的ASP.NET Web服务API发布一些数据,但是当我尝试发布JSON字符串时它会抛出一个DbEntityValidationException。 我试图发布我的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来帮助我调试,但我不完全确定出了什么问题。

尝试将实体模型与控制器分开。

为实体模型创建模型副本,并检查如下:

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覆盖了。 切换到邮递员为我工作测试API调用。

请务必仔细检查Chrome或Firefox的网络工具。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM