-1

J'utilise Microsoft Entity Framework 6.1.3. avec Database First (à partir d'une instance Azure SQL Server). Le produit automatiquement entité ressemble à ceci - la colonne de base de données est datetime2 (0) mais vraiment je veux juste persister la date, mais c'est une autre discussion:ModelState.IsValid est faux sur un poste datetime avec la base de données EF Premier

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

Le contrôleur généré automatiquement:

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

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

le test unitaire en utilisant 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); 

Mais quand je l'ModelState dans inspecte le contrôleur est pas valide et montre l'erreur de format suivant pour LiquidationDate:

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

J'ai cherché de nombreux postes, a essayé de forcer la mise en forme (est-il une question de mise à jour entre les entités C# et SQL Server?) mais je ne vois pas ce que je fais mal. Toute aide est très appréciée!

+1

L'erreur d'état du modèle est due au fait que vous envoyez des données erronées à l'API, cela n'a rien à voir avec Entity Framework. Je suppose que c'est probablement quelque chose à voir avec le format de date ('jj/mm/aaaa' vs' mm/jj/aaaa' par exemple) – DavidG

+0

Il est recommandé d'utiliser DateTimeOffset avec EF. http://stackoverflow.com/questions/9389954/entity-framework-mapping-datetimeoffset-to-sql-server-datetime –

+0

@DavidG - merci pour le commentaire. J'ai retiré toutes les données de date du poste de test unitaire et cela a fonctionné. J'ai ensuite remplacé datetime dans la classe côté client et l'a changé en une chaîne, dont j'ai le contrôle de mise en forme complète, c'est-à-dire aaaa-MM-jj. Je pense que je mettais trop de confiance dans la capacité de RestSharp à mettre en forme de façon appropriée - pas sûr que ce soit même possible, mais je vais le découvrir. – Bexbissell

Répondre

0

À la suite de @ commentaire de Davidg j'ai changé la classe liquidées côté client pour contenir une chaîne au lieu de datetime:

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

puis a fait la mise en forme à l'extérieur de 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); 

Ayant lisez le journal des problèmes RestSharp GitHub: https://github.com/restsharp/RestSharp/issues/629, il n'est pas prévu de prendre en charge cette fonctionnalité.

Merci de m'avoir indiqué la bonne direction.

0

Si vous envoyez des données JSON à l'API Web, assurez-vous que les valeurs de date sont envoyées au format ISO 8601 (2017-04-18T14:22:59Z). Sinon, vous rencontrez des problèmes avec le modelbinder.

Exemple de fonction JS convertir objet date UTC Javascript pour la chaîne ISO 8601 (date seulement sans temps):

/// <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; 
}; 

Voir Why is RestSharp deserializing two dates differently? sur la façon de duper RestSharp.