La validation a échoué pour une ou plusieurs entités lors de l’enregistrement des modifications apscopes à la firebase database SQL Server à l’aide d’Entity Framework.

Je veux enregistrer ma modification dans la firebase database et j’utilise Entity FrameWork Code-First dans ASP.NET MVC 3 / C # mais je reçois des erreurs. Dans ma classe Event, j’ai les types de données DateTime et TimeSpan, mais dans ma firebase database, j’ai respectivement la date et l’heure. Serait-ce la raison? Comment puis-je convertir le type de données approprié dans le code avant d’enregistrer les modifications dans la firebase database.

public class Event { public int EventId { get; set; } public int CategoryId { get; set; } public int PlaceId { get; set; } public ssortingng Title { get; set; } public decimal Price { get; set; } public DateTime EventDate { get; set; } public TimeSpan StartTime { get; set; } public TimeSpan EndTime { get; set; } public ssortingng Description { get; set; } public ssortingng EventPlaceUrl { get; set; } public Category Category { get; set; } public Place Place { get; set; } } 

Méthode dans le contrôleur >>>> Problème à storeDB.SaveChanges ();

 // POST: /EventManager/Edit/386 [HttpPost] public ActionResult Edit(int id, FormCollection collection) { var theEvent = storeDB.Events.Find(id); if (TryUpdateModel(theEvent)) { storeDB.SaveChanges(); return RedirectToAction("Index"); } else { ViewBag.Categories = storeDB.Categories.OrderBy(g => g.Name).ToList(); ViewBag.Places = storeDB.Places.OrderBy(a => a.Name).ToList(); return View(theEvent); } } 

avec

 public class EventCalendarEntities : DbContext { public DbSet Events { get; set; } public DbSet Categories { get; set; } public DbSet Places { get; set; } } 

Base de données SQL Server 2008 R2 / T-SQL

 EventDate (Datatype = date) StartTime (Datatype = time) EndTime (Datatype = time) 

Http Form

 EventDate (Datatype = DateTime) eg 4/8/2011 12:00:00 AM StartTime (Datatype = Timespan/time not sure) eg 08:30:00 EndTime (Datatype = Timespan/time not sure) eg 09:00:00 

Erreur serveur dans l’application ‘/’

La validation a échoué pour une ou plusieurs entités. Voir la propriété ‘EntityValidationErrors’ pour plus de détails.

Description: une exception non gérée s’est produite lors de l’exécution de la demande Web en cours. Consultez la trace de la stack pour plus d’informations sur l’erreur et son origine dans le code.

Détails de l’exception: System.Data.Entity.Validation.DbEntityValidationException: la validation a échoué pour une ou plusieurs entités. Voir la propriété ‘EntityValidationErrors’ pour plus de détails.

Erreur source:

 Line 75: if (TryUpdateModel(theEvent)) Line 76: { Line 77: storeDB.SaveChanges(); Line 78: return RedirectToAction("Index"); Line 79: } 

Fichier source: C: \ sep \ MvcEventCalendar \ MvcEventCalendar \ Controllers \ EventManagerController.cs Ligne: 77

Trace de la stack:

[DbEntityValidationException: la validation a échoué pour une ou plusieurs entités. Voir la propriété ‘EntityValidationErrors’ pour plus de détails.]

Vous pouvez extraire toutes les informations de l’ DbEntityValidationException avec le code suivant (vous devez append les espaces de noms: System.Data.Entity.Validation et System.Diagnostics à votre liste de DbEntityValidationException ):

 catch (DbEntityValidationException dbEx) { foreach (var validationErrors in dbEx.EntityValidationErrors) { foreach (var validationError in validationErrors.ValidationErrors) { Trace.TraceInformation("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage); } } } 

Aucun changement de code requirejs:

Lorsque vous êtes en mode débogage dans le bloc catch {...} , ouvrez la fenêtre “QuickWatch” ( Ctrl + Alt + Q ) et collez-la:

 ((System.Data.Entity.Validation.DbEntityValidationException)ex).EntityValidationErrors 

ou:

 ((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors 

Si vous n’êtes pas dans un try / catch ou n’avez pas access à l’object exception.

Cela vous permettra d’explorer l’arborescence ValidationErrors . C’est le moyen le plus simple que j’ai trouvé pour obtenir un aperçu instantané de ces erreurs.

Dans le cas où vous avez des classes avec les mêmes noms de propriétés, voici une petite extension à la réponse de Praveen:

  catch (DbEntityValidationException dbEx) { foreach (var validationErrors in dbEx.EntityValidationErrors) { foreach (var validationError in validationErrors.ValidationErrors) { Trace.TraceInformation( "Class: {0}, Property: {1}, Error: {2}", validationErrors.Entry.Entity.GetType().FullName, validationError.PropertyName, validationError.ErrorMessage); } } } 

Pour améliorer à la fois Praveen et Tony, j’utilise un remplacement:

 public partial class MyDatabaseEntities : DbContext { public override int SaveChanges() { try { return base.SaveChanges(); } catch (DbEntityValidationException dbEx) { foreach (var validationErrors in dbEx.EntityValidationErrors) { foreach (var validationError in validationErrors.ValidationErrors) { Trace.TraceInformation("Class: {0}, Property: {1}, Error: {2}", validationErrors.Entry.Entity.GetType().FullName, validationError.PropertyName, validationError.ErrorMessage); } } throw; // You can also choose to handle the exception here... } } } 

Ce code a aidé à trouver mon problème lorsque j’avais des problèmes avec mes Erros Entity VAlidation. Il m’a dit le problème exact avec ma définition d’entité. Essayez de suivre le code où vous devez couvrir storeDB.SaveChanges (); en suivant essayez catch block.

  try { if (TryUpdateModel(theEvent)) { storeDB.SaveChanges(); return RedirectToAction("Index"); } } catch (System.Data.Entity.Validation.DbEntityValidationException dbEx) { Exception raise = dbEx; foreach (var validationErrors in dbEx.EntityValidationErrors) { foreach (var validationError in validationErrors.ValidationErrors) { ssortingng message = ssortingng.Format("{0}:{1}", validationErrors.Entry.Entity.ToSsortingng(), validationError.ErrorMessage); // raise a new exception nesting // the current instance as InnerException raise = new InvalidOperationException(message, raise); } } throw raise; } 

Cette implémentation incorpore une exception d’entité à l’exception avec le texte de détail. Il gère les DbEntityValidationException , DbUpdateException , les intervalles de données datetime2 (MS SQL) et inclut une clé d’entité non valide dans le message (utile lors de l’enregistrement de nombreuses entités lors d’un appel SaveChanges ).

Commencez par remplacer SaveChanges dans la classe DbContext:

 public class AppDbContext : DbContext { public override int SaveChanges() { try { return base.SaveChanges(); } catch (DbEntityValidationException dbEntityValidationException) { throw ExceptionHelper.CreateFromEntityValidation(dbEntityValidationException); } catch (DbUpdateException dbUpdateException) { throw ExceptionHelper.CreateFromDbUpdateException(dbUpdateException); } } public override async Task SaveChangesAsync(CancellationToken cancellationToken) { try { return await base.SaveChangesAsync(cancellationToken); } catch (DbEntityValidationException dbEntityValidationException) { throw ExceptionHelper.CreateFromEntityValidation(dbEntityValidationException); } catch (DbUpdateException dbUpdateException) { throw ExceptionHelper.CreateFromDbUpdateException(dbUpdateException); } } 

Classe ExceptionHelper:

 public class ExceptionHelper { public static Exception CreateFromEntityValidation(DbEntityValidationException ex) { return new Exception(GetDbEntityValidationMessage(ex), ex); } public static ssortingng GetDbEntityValidationMessage(DbEntityValidationException ex) { // Resortingeve the error messages as a list of ssortingngs. var errorMessages = ex.EntityValidationErrors .SelectMany(x => x.ValidationErrors) .Select(x => x.ErrorMessage); // Join the list to a single ssortingng. var fullErrorMessage = ssortingng.Join("; ", errorMessages); // Combine the original exception message with the new one. var exceptionMessage = ssortingng.Concat(ex.Message, " The validation errors are: ", fullErrorMessage); return exceptionMessage; } public static IEnumerable GetInners(Exception ex) { for (Exception e = ex; e != null; e = e.InnerException) yield return e; } public static Exception CreateFromDbUpdateException(DbUpdateException dbUpdateException) { var inner = GetInners(dbUpdateException).Last(); ssortingng message = ""; int i = 1; foreach (var entry in dbUpdateException.Ensortinges) { var entry1 = entry; var obj = entry1.CurrentValues.ToObject(); var type = obj.GetType(); var propertyNames = entry1.CurrentValues.PropertyNames.Where(x => inner.Message.Contains(x)).ToList(); // check MS SQL datetime2 error if (inner.Message.Contains("datetime2")) { var propertyNames2 = from x in type.GetProperties() where x.PropertyType == typeof(DateTime) || x.PropertyType == typeof(DateTime?) select x.Name; propertyNames.AddRange(propertyNames2); } message += "Entry " + i++ + " " + type.Name + ": " + ssortingng.Join("; ", propertyNames.Select(x => ssortingng.Format("'{0}' = '{1}'", x, entry1.CurrentValues[x]))); } return new Exception(message, dbUpdateException); } } 

Je recevais cette erreur aujourd’hui et je ne pouvais pas y arriver pendant un moment, mais j’ai réalisé que c’était après avoir ajouté des RequireAtsortingbute à mes modèles et que certaines données de développement ne RequireAtsortingbute pas tous les champs requirejs.
Donc, notez que si vous obtenez cette erreur lors de la mise à jour de la firebase database via une stratégie d’initialisation telle que DropCreateDatabaseIfModelChanges vous devez vous assurer que vos données de départ satisfont et satisfont tous les atsortingbuts de validation des modèles .

Je sais que c’est légèrement différent du problème de la question, mais c’est une question populaire, alors j’ai pensé append un peu plus à la réponse pour les autres ayant le même problème que moi.
J’espère que cela aide les autres 🙂

Je pense que l’ajout de try / catch pour chaque opération SaveChanges() n’est pas une bonne pratique, il est préférable de centraliser ceci:

Ajoutez cette classe à la classe principale DbContext :

 public override int SaveChanges() { try { return base.SaveChanges(); } catch (DbEntityValidationException ex) { ssortingng errorMessages = ssortingng.Join("; ", ex.EntityValidationErrors.SelectMany(x => x.ValidationErrors).Select(x => x.ErrorMessage)); throw new DbEntityValidationException(errorMessages); } } 

Cela écrasera la méthode SaveChanges() votre contexte et vous obtiendrez une liste séparée par des virgules contenant toutes les erreurs de validation d’entité.

Cela peut également être amélioré, pour enregistrer les erreurs dans env de production, au lieu de simplement lancer une erreur.

J’espère que c’est utile.

Voici une extension de l’extension de Tony … 🙂

Pour Entity Framework 4.x, si vous souhaitez obtenir le nom et la valeur du champ clé afin de savoir quelle instance d’entité (enregistrement de firebase database) rencontre le problème, vous pouvez append les éléments suivants. Cela permet d’accéder aux membres de la classe ObjectContext les plus puissants de votre object DbContext.

 // Get the key field name & value. // This assumes your DbContext object is "_context", and that it is a single part key. var e = ((IObjectContextAdapter)_context).ObjectContext.ObjectStateManager.GetObjectStateEntry(validationErrors.Entry.Entity); ssortingng key = e.EntityKey.EntityKeyValues[0].Key; ssortingng val = e.EntityKey.EntityKeyValues[0].Value; 

Je n’aime pas les exceptions, j’ai enregistré les modifications OnSave et avoir cette

 var validationErrors = model.GetValidationErrors(); var h = validationErrors.SelectMany(x => x.ValidationErrors .Select(f => "Entity: " +(x.Entry.Entity) + " : " + f.PropertyName + "->" + f.ErrorMessage)); 

Cette erreur se produit également lorsque vous essayez d’enregistrer une entité comportant des erreurs de validation. Une bonne façon de provoquer ceci est d’oublier de vérifier ModelState.IsValid avant de l’enregistrer dans votre firebase database.

Assurez-vous que si vous avez nvarchar (50) dans la ligne DB, vous n’essayez pas d’y insérer plus de 50 caractères. Erreur stupide mais il m’a fallu 3 heures pour le comprendre.

Cela peut être dû au nombre maximum de caractères autorisés pour une colonne spécifique, comme dans un champ SQL, un champ peut avoir le type de données suivant nvarchar(5) mais le nombre de caractères saisis par l’utilisateur est supérieur au nombre spécifié.

J’ai fait face au même problème il y a quelques jours lors de la mise à jour de la firebase database. Dans mon cas, il y avait peu de nouvelles colonnes non nullables ajoutées pour la maintenance qui n’étaient pas fournies dans le code à l’origine de l’exception. Je trouve ces champs et les valeurs fournies pour eux et leur résolution.

Merci pour vos réponses, ça m’aide beaucoup. comme je code dans Vb.Net, ce code Bolt pour Vb.Net

 Try Return MyBase.SaveChanges() Catch dbEx As Validation.DbEntityValidationException For Each [error] In From validationErrors In dbEx.EntityValidationErrors From validationError In validationErrors.ValidationErrors Select New With { .PropertyName = validationError.PropertyName, .ErrorMessage = validationError.ErrorMessage, .ClassFullName = validationErrors.Entry.Entity .GetType().FullName} Diagnostics.Trace.TraceInformation("Class: {0}, Property: {1}, Error: {2}", [error].ClassFullName, [error].PropertyName, [error].ErrorMessage) Next Throw End Try 

elle peut être provoquée par une propriété qui n’est pas remplie par le modèle .. au lieu de cela, elle est remplie par le contrôleur .. ce qui peut provoquer cette erreur. et cette seconde hypothèse est. Vous avez peut-être déjà des données dans votre firebase database et vous essayez de les mettre à jour, mais vous les récupérez maintenant.