-1

我正在使用Microsoft的Entity Framework 6.1.3。数据库优先(来自Azure SQL Server实例)。自动生成的实体是这样的 - 数据库列是DATETIME2(0),但我真的只是想坚持的日期但这是另一个讨论:ModelState.IsValid在EF数据库优先发布日期时间为false

public partial class Liquidated 
{ 
    public long ID { get; set; } 
    public System.DateTime LiquidationDate { get; set; } 
    public string Comment { get; set; } 
} 

自动生成的控制器:

// POST: api/Liquidations 
    [ResponseType(typeof(Liquidated))] 
    public IHttpActionResult PostLiquidated(Liquidated liquidated) 
    { 

     if (!ModelState.IsValid) 
     { 
      return BadRequest(ModelState); 
     } 

单元测试使用RestSharp:

 var client = new RestClient("http://localhost:64185/api/Liquidations"); 
     var request = new RestRequest(Method.POST); 

     request.AddHeader("cache-control", "no-cache"); 
     request.AddHeader("authorization", "bearer " + token.access_token); 
     request.AddHeader("content-type", "application/x-www-form-urlencoded"); 
     request.AddHeader("audience", "Any"); 
     request.AddHeader("accept-language", "en-gb"); 
     request.AddHeader("accept", "application/json"); 

     var liquidation = new Liquidated(); 

     liquidation.LiquidationDate = DateTime.Now; 
     liquidation.Comments = "Updated group name 1"; 

     request.AddObject(liquidation); 

     IRestResponse<Liquidated> response = client.Execute<Liquidated>(request); 

但是,当我在控制器检查的ModelState是无效的并给出了LiquidationDate以下格式错误:

"The value '18/04/2017 14:26:12' is not valid for LiquidationDate." 

我搜索很多帖子,试图强行格式化(是C#实体和SQL Server之间的日期格式的问题?),但我看不到我做错了什么。任何帮助深表感谢!

+1

模型状态错误是因为您将错误的数据发布到API,它与实体框架无关。我猜想这很可能与日期格式有关(例如'dd/mm/yyy' vs'mm/dd/yyyy') – DavidG

+0

建议在EF中使用DateTimeOffset。 http://stackoverflow.com/questions/9389954/entity-framework-mapping-datetimeoffset-to-sql-server-datetime –

+0

@DavidG - 感谢您的评论。我从单元测试文件中删除了任何日期数据并且工作。然后,我在客户端类中替换了日期时间,并将其更改为字符串,其中我有完整的格式控制,即yyyy-MM-dd。我认为我对于RestSharp格式化的能力过分信任 - 不确定它甚至可能,但会发现。 – Bexbissell

回答

0

从@ DavidG的评论继我改变了客户端的变现类包含一个字符串,而不是日期时间:

public partial class Liquidated 
{ 
    public long ID { get; set; } 
    public string LiquidationDate { get; set; } 
    public string Comments { get; set; } 
} 

,然后做外RestSharp的格式:

 var client = new RestClient("http://localhost:64185/api/Liquidations"); 
     var request = new RestRequest(Method.POST); 
     request.AddHeader("postman-token", "a95ce9b5-8c7f-e223-faa6-3768f7edd10c"); 
     request.AddHeader("cache-control", "no-cache"); 
     request.AddHeader("authorization", "bearer " + token.access_token); 
     request.AddHeader("content-type", "application/x-www-form-urlencoded"); 
     request.AddHeader("audience", "Any"); 
     request.AddHeader("accept-language", "en-gb"); 
     request.AddHeader("accept", "application/json"); 

     var liquidation = new Liquidated(); 

     liquidation.LiquidationDate = DateTime.Now.ToString("yyyy-MM-dd"); 
     liquidation.Comments = "Updated group name 1"; 

     // request.DateFormat = "yyyy-MM-dd"; // This is ignored by RestSharp 
     request.AddObject(liquidation); 

     IRestResponse<Liquidated> response = client.Execute<Liquidated>(request); 

有阅读RestSharp GitHub问题日志:https://github.com/restsharp/RestSharp/issues/629,目前还没有计划支持该工具。

感谢您指点我正确的方向。

0

如果将JSON数据发布到Web API,请确保日期值以ISO 8601格式发送(2017-04-18T14:22:59Z)。否则你会遇到模型绑定器的问题。 JS功能

例为UTC javascript日期对象转换为ISO 8601串(日期只是没时间):

/// <summary> 
/// Takes a utc js date and converts it to a iso8601 utc string 
/// </summary> 
GlobalJsHelpers.Iso8601FromUtc = function(utcDate) { 
    //create a two digit month string (01-12) 
    var month = ('0' + (utcDate.getUTCMonth() + 1)).substr(-2); 
    //create a two digit day string (01-31) 
    var day = ('0' + utcDate.getUTCDate()).substr(-2); 
    return utcDate.getUTCFullYear() + '-' + month + '-' + day; 
}; 

参见如何欺骗RestSharp Why is RestSharp deserializing two dates differently?

相关问题