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

C# 实体框架ASP.NET;HTTP POST:JSON请求正文DbEntityValidationException中存在必需的值,c#,asp.net,oracle,entity-framework,C#,Asp.net,Oracle,Entity Framework,我试图通过我的ASP.NET Web服务API发布一些数据,但当我尝试发布JSON字符串时,它抛出了DbEntityValidationException。我试图发布JSON字符串的错误在哪里 我使用代码块来帮助我调试我的问题,但它告诉我,当我的字段存在于JSON字符串中时,它们是必需的,几乎将字符串视为不存在。它让我知道请求主体是否为null,但不管名称-值对如何,它仍然告诉我字段是必需的 我试图发布的JSON字符串几乎是从帮助页面上撕下来的 { "CUSTOMER_ID": 7.0,

我试图通过我的ASP.NET Web服务API发布一些数据,但当我尝试发布JSON字符串时,它抛出了DbEntityValidationException。我试图发布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()"
响应:500
“消息”:“发生错误。”,
“例外消息”:“一个或多个实体的验证失败。有关详细信息,请参阅“EntityValidationErrors”属性。验证错误为:CUSTOMER.CUSTOMER\u USERNAME:CUSTOMER\u USERNAME字段是必需的。;CUSTOMER.CUSTOMER\u PASSWORD:CUSTOMER\u PASSWORD字段是必需的。;CUSTOMER.CUSTOMER\u NAME:必须输入CUSTOMER\u NAME字段。;CUSTOMER.CUSTOMER\u EMAIL:CUSTOMER\u EMAIL字段为必填项。“,
“ExceptionType”:“System.Data.Entity.Validation.DbEntityValidationException”
“StackTrace”:“在WebAPI.Models.Entities3.SaveChangesSync()中,C:\\Users\\\[username]\\Desktop\\[folder]\\WebAPI\\WebAPI\\WebAPI\\Models\\Model1.Context.cs:WebAPI.Controllers.CUSTOMERsController.d_4.MoveNext()中,在C:\\Users\\[user]\\Desktop\\\[folder]中,第65行\r\n\\WebAPI\\WebAPI\\WebAPI\\Controllers\\CustomerController.cs:第88行\r\n--从引发异常的上一个位置开始的堆栈结束跟踪----\r\n在System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务任务任务)\r\n在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务任务任务任务任务)中\r\n位于System.Threading.Tasks.TaskHelperExtensions.d_u1`1.MoveNext()\r\n---来自引发异常的上一个位置的堆栈结束跟踪----\r\n位于System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务任务)\r\n位于System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务任务任务任务)\r\n在System.Web.Http.Controllers.ApiControllerActionInvoker.d_u1.MoveNext()\r\n---从引发异常的上一个位置开始的堆栈结束跟踪----\r\n在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务任务)\r\n在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务任务)\r\n位于System.Web.Http.Controllers.ActionFilterResult.d\u 5.MoveNext()\r\n---来自引发异常的上一个位置的堆栈结束跟踪----\r\n位于System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务任务)\r\n位于System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务任务任务任务)\r\n位于System.Web.Http.Dispatcher.HttpControllerDispatcher.d_u15.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; }
    }
}
//POST:api/CUSTOMERs
[响应类型(类型(客户))]
公共异步任务后客户(客户)
{
如果(!ModelState.IsValid)
{
返回请求(ModelState);
}
db.CUSTOMERs.Add(客户);
尝试
{
等待db.saveChangesSync();
}
捕获(DbUpdateException)
{
if(CUSTOMERExists(cUSTOMER.cUSTOMER\u ID))
{
返回冲突();
}
其他的
{
投掷;
}
}
返回CreatedAtRoute(“DefaultApi”,new{id=cUSTOMER.cUSTOMER\u id},cUSTOMER);
}
=============================================================================
名称空间WebAPI.Models
{
使用制度;
使用System.Collections.Generic;
公共部分类客户
{
公共十进制客户标识{get;set;}
公共字符串CUSTOMER_用户名{get;set;}
公共字符串CUSTOMER_密码{get;set;}
公共字符串CUSTOMER_NAME{get;set;}
公共字符串CUSTOMER_EMAIL{get;set;}
}
}

标题很好,因为我正在使用它来帮助我调试,但我不完全确定出了什么问题。

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

创建实体模型的模型副本,并进行如下检查:

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; }
}
public异步任务后客户(CUSTOMERDTO)
{
如果(!ModelState.IsValid)
{
返回请求(ModelState);
}
如果(dto!=null)
{
客户客户=新客户();
//编写代码将dto分配给cust对象
db.CUSTOMERs.Add(客户);
}
尝试
{
等待db.saveChangesSync();
}
捕获(DbUpdateException)
{
if(CUSTOMERExists(dto.CUSTOMER_ID))
{
返回冲突();
}
其他的
{
投掷;
}
}
返回CreatedAtRoute(“DefaultApi”,新的{id=dto.CUSTOMER\u id},dto);
}
公共类CUSTOMERDTO
{
公共十进制客户标识{`enter code here`get;set;}
公共字符串CUSTOMER_用户名{get;set;}
公共字符串CUSTOMER_密码{get;set;}
公共字符串CUSTOMER_NAME{get;set;}
公共字符串CUSTOMER_EMAIL{get;set;}
}

我不可避免地发现,从发出的请求被标题
application/x-www-form-urlencoded
覆盖。切换到Postman对我测试API调用很有效


始终仔细检查Chrome或Firefox的网络工具。

尝试添加
[FromBody]
如下:
公共异步任务后客户([FromBody]客户客户)