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

j'ai cette erreur lors de la première approche de code de ma base de données.

Échec de la Validation

pour une ou plusieurs entités. Voir la propriété "EntityValidationErrors" pour plus de détails.

Pour être honnête, je ne sais pas comment vérifier le contenu des erreurs de validation. Visual Studio me montre que c'est un tableau avec 8 objets, donc 8 erreurs de validation.

cela fonctionnait avec mon précédent modèle, mais j'ai fait quelques changements que j'explique ci-dessous:

  • j'ai eu un enum appelé statut, Je l'ai changé en une classe appelée statut
  • j'ai changé la classe ApplicantsPositionHistory pour avoir 2 clé étrangère à la même table

Excusez-moi pour le long code, mais je dois coller tout. L'exception est lancée dans la dernière ligne du code suivant.

namespace Data.Model
{  
    public class Position
    {
        [DatabaseGenerated(System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.Identity)]   
        public int PositionID { get; set; }

        [Required(ErrorMessage = "Position name is required.")]
        [StringLength(20, MinimumLength = 3, ErrorMessage = "Name should not be longer than 20 characters.")]
        [Display(Name = "Position name")]              
        public string name { get; set; }

        [Required(ErrorMessage = "Number of years is required")] 
        [Display(Name = "Number of years")]        
        public int yearsExperienceRequired { get; set; }

        public virtual ICollection<ApplicantPosition> applicantPosition { get; set; }
    }

    public class Applicant
    {
        [DatabaseGenerated(System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.Identity)]      
        public int ApplicantID { get; set; }

        [Required(ErrorMessage = "Name is required")] 
        [StringLength(20, MinimumLength = 3, ErrorMessage="Name should not be longer than 20 characters.")]
        [Display(Name = "First and LastName")]
        public string name { get; set; }

        [Required(ErrorMessage = "Telephone number is required")] 
        [StringLength(10, MinimumLength = 3, ErrorMessage = "Telephone should not be longer than 20 characters.")]
        [Display(Name = "Telephone Number")]
        public string telephone { get; set; }

        [Required(ErrorMessage = "Skype username is required")] 
        [StringLength(10, MinimumLength = 3, ErrorMessage = "Skype user should not be longer than 20 characters.")]
        [Display(Name = "Skype Username")]
        public string skypeuser { get; set; }

        public byte[] photo { get; set; }

        public virtual ICollection<ApplicantPosition> applicantPosition { get; set; }
    }

    public class ApplicantPosition
    {
        [Key]
        [Column("ApplicantID", Order = 0)]
        public int ApplicantID { get; set; }

        [Key]
        [Column("PositionID", Order = 1)]
        public int PositionID { get; set; }

        public virtual Position Position { get; set; }

        public virtual Applicant Applicant { get; set; }

        [Required(ErrorMessage = "Applied date is required")] 
        [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]
        [Display(Name = "Date applied")]     
        public DateTime appliedDate { get; set; }

        [Column("StatusID", Order = 0)]
        public int StatusID { get; set; }

        public Status CurrentStatus { get; set; }

        //[NotMapped]
        //public int numberOfApplicantsApplied
        //{
        //    get
        //    {
        //        int query =
        //             (from ap in Position
        //              where ap.Status == (int)Status.Applied
        //              select ap
        //                  ).Count();
        //        return query;
        //    }
        //}
    }

    public class Address
    {
        [StringLength(20, MinimumLength = 3, ErrorMessage = "Country should not be longer than 20 characters.")]
        public string Country { get; set; }

        [StringLength(20, MinimumLength = 3, ErrorMessage = "City  should not be longer than 20 characters.")]
        public string City { get; set; }

        [StringLength(50, MinimumLength = 3, ErrorMessage = "Address  should not be longer than 50 characters.")]
        [Display(Name = "Address Line 1")]     
        public string AddressLine1 { get; set; }

        [Display(Name = "Address Line 2")]
        public string AddressLine2 { get; set; }   
    }

    public class ApplicationPositionHistory
    {
        [DatabaseGenerated(System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.Identity)]
        public int ApplicationPositionHistoryID { get; set; }

        public ApplicantPosition applicantPosition { get; set; }

        [Column("oldStatusID")]
        public int oldStatusID { get; set; }

        [Column("newStatusID")]
        public int newStatusID { get; set; }

        public Status oldStatus { get; set; }

        public Status newStatus { get; set; }

        [StringLength(500, MinimumLength = 3, ErrorMessage = "Comments  should not be longer than 500 characters.")]
        [Display(Name = "Comments")]
        public string comments { get; set; }

        [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]
        [Display(Name = "Date")]     
        public DateTime dateModified { get; set; }
    }

    public class Status
    {
        [DatabaseGenerated(System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.Identity)]
        public int StatusID { get; set; }

        [StringLength(20, MinimumLength = 3, ErrorMessage = "Status  should not be longer than 20 characters.")]
        [Display(Name = "Status")]
        public string status { get; set; }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Entity;
using System.IO;

namespace Data.Model
{
    public class HRContextInitializer : DropCreateDatabaseAlways<HRContext>
    {
        protected override void Seed(HRContext context)
        {
            #region Status
            Status applied = new Status() { status = "Applied" };
            Status reviewedByHR = new Status() { status = "Reviewed By HR" };
            Status approvedByHR = new Status() { status = "Approved by HR" };
            Status rejectedByHR = new Status() { status = "Rejected by HR" };
            Status assignedToTechnicalDepartment = new Status() { status = "Assigned to Technical Department" };
            Status approvedByTechnicalDepartment = new Status() { status = "Approved by Technical Department" };
            Status rejectedByTechnicalDepartment = new Status() { status = "Rejected by Technical Department" };

            Status assignedToGeneralManager = new Status() { status = "Assigned to General Manager" };
            Status approvedByGeneralManager = new Status() { status = "Approved by General Manager" };
            Status rejectedByGeneralManager = new Status() { status = "Rejected by General Manager" };

            context.Status.Add(applied);
            context.Status.Add(reviewedByHR);
            context.Status.Add(approvedByHR);
            context.Status.Add(rejectedByHR);
            context.Status.Add(assignedToTechnicalDepartment);
            context.Status.Add(approvedByTechnicalDepartment);
            context.Status.Add(rejectedByTechnicalDepartment);
            context.Status.Add(assignedToGeneralManager);
            context.Status.Add(approvedByGeneralManager);
            context.Status.Add(rejectedByGeneralManager); 
            #endregion    

            #region Position
            Position netdeveloper = new Position() { name = ".net developer", yearsExperienceRequired = 5 };
            Position javadeveloper = new Position() { name = "java developer", yearsExperienceRequired = 5 };
            context.Positions.Add(netdeveloper);
            context.Positions.Add(javadeveloper); 
            #endregion

            #region Applicants
            Applicant luis = new Applicant()
            {
                name = "Luis",
                skypeuser = "le.valencia",
                telephone = "0491732825",
                photo = File.ReadAllBytes(@"C:UsersLUIS.SIMBIOSDocumentsVisual Studio 2010ProjectsSlnHRHRRazorFormsContentpictures.jpg")
            };

            Applicant john = new Applicant()
            {
                name = "John",
                skypeuser = "jo.valencia",
                telephone = "3435343543",
                photo = File.ReadAllBytes(@"C:UsersLUIS.SIMBIOSDocumentsVisual Studio 2010ProjectsSlnHRHRRazorFormsContentpictures.jpg")
            };

            context.Applicants.Add(luis);
            context.Applicants.Add(john); 
            #endregion

            #region ApplicantsPositions
            ApplicantPosition appicantposition = new ApplicantPosition()
            {
                Applicant = luis,
                Position = netdeveloper,
                appliedDate = DateTime.Today,
                StatusID = 1
            };

            ApplicantPosition appicantposition2 = new ApplicantPosition()
            {
                Applicant = john,
                Position = javadeveloper,
                appliedDate = DateTime.Today,
                StatusID = 1
            };        

            context.ApplicantsPositions.Add(appicantposition);            
            context.ApplicantsPositions.Add(appicantposition2); 
            #endregion

            context.SaveChanges(); --->> Error here
        }
    }
}
685
demandé sur Laurel 2011-10-17 18:33:44

24 réponses

Pour être honnête, je ne sais pas comment vérifier le contenu des erreurs de validation. Visual Studio me montre que c'est un tableau avec 8 objets, donc 8 erreurs de validation.

en fait, vous devriez voir les erreurs si vous percez dans ce tableau dans Visual studio pendant le débogage. Mais vous pouvez également attraper l'exception et ensuite écrire les erreurs dans un magasin de journalisation ou la console:

try
{
    // Your code...
    // Could also be before try if you know the exception occurs in SaveChanges

    context.SaveChanges();
}
catch (DbEntityValidationException e)
{
    foreach (var eve in e.EntityValidationErrors)
    {
        Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
            eve.Entry.Entity.GetType().Name, eve.Entry.State);
        foreach (var ve in eve.ValidationErrors)
        {
            Console.WriteLine("- Property: \"{0}\", Error: \"{1}\"",
                ve.PropertyName, ve.ErrorMessage);
        }
    }
    throw;
}

EntityValidationErrors est un collection qui représente les entités qui n'ont pas pu être validées avec succès, et la collection interne ValidationErrors par entité est une liste d'erreurs au niveau de la propriété.

ces messages de validation sont habituellement assez utiles pour trouver la source du problème.

Modifier

quelques légères améliorations:

Le valeur de la délinquance propriété peut être inclus dans la boucle intérieure comme suit:

        foreach (var ve in eve.ValidationErrors)
        {
            Console.WriteLine("- Property: \"{0}\", Value: \"{1}\", Error: \"{2}\"",
                ve.PropertyName,
                eve.Entry.CurrentValues.GetValue<object>(ve.PropertyName),
                ve.ErrorMessage);
        }

tout en déboguant Debug.Write pourrait être préférable à Console.WriteLine car il fonctionne dans tous les types d'applications, pas seulement les applications console (Merci à @Bart pour sa note dans les commentaires ci-dessous).

pour les applications web qui sont en production et qui utilisent Elmah pour la journalisation d'exception il s'est avéré être très utile pour moi de créer un personnalisé exception et remplacer SaveChanges afin de lancer cette nouvelle exception.

le type d'exception personnalisé ressemble à ceci:

public class FormattedDbEntityValidationException : Exception
{
    public FormattedDbEntityValidationException(DbEntityValidationException innerException) :
        base(null, innerException)
    {
    }

    public override string Message
    {
        get
        {
            var innerException = InnerException as DbEntityValidationException;
            if (innerException != null)
            {
                StringBuilder sb = new StringBuilder();

                sb.AppendLine();
                sb.AppendLine();
                foreach (var eve in innerException.EntityValidationErrors)
                {
                    sb.AppendLine(string.Format("- Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
                        eve.Entry.Entity.GetType().FullName, eve.Entry.State));
                    foreach (var ve in eve.ValidationErrors)
                    {
                        sb.AppendLine(string.Format("-- Property: \"{0}\", Value: \"{1}\", Error: \"{2}\"",
                            ve.PropertyName,
                            eve.Entry.CurrentValues.GetValue<object>(ve.PropertyName),
                            ve.ErrorMessage));
                    }
                }
                sb.AppendLine();

                return sb.ToString();
            }

            return base.Message;
        }
    }
}

et SaveChanges peuvent être remplacés de la manière suivante:

public class MyContext : DbContext
{
    // ...

    public override int SaveChanges()
    {
        try
        {
            return base.SaveChanges();
        }
        catch (DbEntityValidationException e)
        {
            var newException = new FormattedDbEntityValidationException(e);
            throw newException;
        }
    }
}

quelques remarques:

  • l'écran d'erreur Jaune qu'Elmah affiche dans L'interface web ou dans les e-mails envoyés (si vous avez configuré cela) affiche maintenant le détails de validation directement en haut du message.

  • l'Écrasement de la Message de la propriété à l'exception personnalisée au lieu de les écraser ToString() a l'avantage que la norme ASP.NET "le Jaune de l'écran de la mort (YSOD)" affiche ce message. Contrairement à Elmah , la YSOD n'utilise apparemment pas ToString() , mais les deux affichent la propriété Message .

  • emballage l'original DbEntityValidationException comme exception interne garantit que la trace de la pile originale sera toujours disponible et est affiché en Elmah et la YSOD.

  • en mettant un point de rupture sur la ligne throw newException; vous pouvez simplement inspecter la propriété newException.Message comme un texte au lieu de percer dans les collections de validation qui est un peu maladroit et ne semble pas fonctionner facilement pour tout le monde (voir les commentaires ci-dessous).

1095
répondu Slauma 2017-12-14 19:05:48

vous pouvez le faire à partir de Visual Studio pendant le débogage sans écrire de code, pas même un bloc catch.

il suffit d'ajouter une montre avec le nom:

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

l'expression watch $exception affiche toute exception lancée dans le contexte actuel, même si elle n'a pas été capturée et assignée à une variable.

basé sur http://mattrandle.me/viewing-entityvalidationerrors-in-visual-studio /

395
répondu yoel halb 2018-03-27 07:29:00

cela pourrait effectivement le faire sans avoir à écrire le code:

dans votre bloc de capture, ajoutez un point d'arrêt à la ligne de code suivante:

catch (Exception exception)
{

}

maintenant si vous passez en stationnaire sur exception ou l'ajoutez au Watch et puis naviguez dans les détails d'exception comme indiqué ci-dessous; vous verrez quelle colonne(s) particulière (s) est/ sont la cause du problème que cette erreur se produit habituellement quand une contrainte de tableau est violée..

enter image description here

Grande image

86
répondu Tarek Freijah 2015-06-22 14:30:07

Voici comment vous pouvez vérifier le contenu du EntityValidationErrors dans Visual Studio (sans écrire de code supplémentaire) i.e. pendant débogage dans le IDE .

Le Problème?

vous avez raison, le débogueur de Visual Studio View Details Popup ne montre pas les erreurs réelles dans la collection EntityValidationErrors .

enter image description here

La Solution!

il suffit d'ajouter l'expression suivante dans une fenêtre Quick Watch et de cliquer sur réévaluer .

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

dans mon cas, voir comment je suis capable d'étendre dans le ValidationErrors List à l'intérieur du EntityValidationErrors collection

enter image description here

References: mattrandle.me blog post , réponse de @yoel

42
répondu Shiva 2017-05-23 10:31:37

pour un moyen rapide de voir la première erreur sans même ajouter une montre, vous pouvez coller dans la fenêtre immédiate:

((System.Data.Entity.Validation.DbEntityValidationException)$exception)
    .EntityValidationErrors.First()
    .ValidationErrors.First()
35
répondu djdmbrwsk 2014-09-17 12:58:28

pour quiconque travaille dans VB.NET

Try
Catch ex As DbEntityValidationException
    For Each a In ex.EntityValidationErrors
        For Each b In a.ValidationErrors
            Dim st1 As String = b.PropertyName
            Dim st2 As String = b.ErrorMessage
        Next
    Next
End Try
14
répondu nghiavt 2015-03-30 10:57:20

pendant que vous êtes en mode débogage dans le bloc catch {...} ouvrez la fenêtre" QuickWatch " ( ctrl + alt + q ) et collez là:

((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 accès à l'objet exception.

cela vous permettra de creuser dans l'arbre ValidationErrors . C'est le moyen le plus facile que j'ai trouvé pour avoir un aperçu instantané de ces erreurs.

11
répondu GONeale 2014-08-27 01:29:11

si vous êtes simplement en train d'attraper une exception générique, il peut vous être utile de lancer ceci comme une DbEntityValidationException . Ce type d'exception a une propriété de Validation Errors, et en continuant à étendre votre chemin dans eux, vous trouverez tous les problèmes.

par exemple, si vous mettez un point de rupture dans la prise, vous pouvez jeter ce qui suit dans une montre:

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

un exemple d'erreur est si un field n'autorise pas nulls, et vous avez une chaîne null, vous verrez qu'elle dit que le champ est requis.

10
répondu Greg 2014-06-12 19:17:06

dans debug, vous pouvez entrer ceci dans le champ d'entrée de votre évaluateur D'expressions QuickWatch:

context.GetValidationErrors()
9
répondu silverfox1948 2016-02-09 05:34:48

il suffit de vérifier la longueur de champ de votre Table de base de données . Votre texte D'entrée est plus grand que la longueur de la colonne de données de type longueur

8
répondu Hardeep Singh 2015-03-09 05:11:52

j'ai dû écrire ceci dans la fenêtre immédiate: 3

(((exception as System.Data.Entity.Validation.DbEntityValidationException).EntityValidationErrors as System.Collections.Generic.List<System.Data.Entity.Validation.DbEntityValidationResult>)[0].ValidationErrors as System.Collections.Generic.List<System.Data.Entity.Validation.DbValidationError>)[0]

pour plonger dans l'erreur exacte !

7
répondu Nour Sabouny 2015-09-14 09:03:50

notez que Entity.GetType().BaseType.Name donne le nom de type que vous avez spécifié, pas celui avec tous les chiffres hexadécimaux dans son nom.

6
répondu Eric Nelson 2012-02-24 19:48:12

en utilisant la réponse de @Slauma j'ai fait un code snippet (un encerclement avec snippet) pour une meilleure utilisation.

<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
      <SnippetTypes>
        <SnippetType>SurroundsWith</SnippetType>
      </SnippetTypes>
      <Title>ValidationErrorsTryCatch</Title>
      <Author>Phoenix</Author>
      <Description>
      </Description>
      <HelpUrl>
      </HelpUrl>
      <Shortcut>
      </Shortcut>
    </Header>
    <Snippet>
      <Code Language="csharp"><![CDATA[try
{
    $selected$ $end$
}
catch (System.Data.Entity.Validation.DbEntityValidationException e)
{
    foreach (var eve in e.EntityValidationErrors)
    {
        Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
            eve.Entry.Entity.GetType().Name, eve.Entry.State);
        foreach (var ve in eve.ValidationErrors)
        {
            Console.WriteLine("- Property: \"{0}\", Error: \"{1}\"",
                ve.PropertyName, ve.ErrorMessage);
        }
    }
    throw;
}]]></Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>
6
répondu Phoenix_uy 2014-07-14 19:57:41

selon la réponse de @Slauma et la suggestion de @Milton j'ai étendu la méthode de sauvegarde personnalisée de notre classe de base avec un try / catch qui va gérer (et donc se connecter dans notre journalisation d'erreurs!) ces sortes d'exceptions.

// Where `BaseDB` is your Entities object... (it could be `this` in a different design)
public void Save(bool? validateEntities = null)
{
    try
    {
        //Capture and set the validation state if we decide to
        bool validateOnSaveEnabledStartState = BaseDB.Configuration.ValidateOnSaveEnabled;
        if (validateEntities.HasValue)
            BaseDB.Configuration.ValidateOnSaveEnabled = validateEntities.Value;

        BaseDB.SaveChanges();

        //Revert the validation state when done
        if (validateEntities.HasValue)
            BaseDB.Configuration.ValidateOnSaveEnabled = validateOnSaveEnabledStartState;
    }
    catch (DbEntityValidationException e)
    {
        StringBuilder sb = new StringBuilder();
        foreach (var eve in e.EntityValidationErrors)
        {
            sb.AppendLine(string.Format("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:", 
                                            eve.Entry.Entity.GetType().Name,
                                            eve.Entry.State));
            foreach (var ve in eve.ValidationErrors)
            {
                sb.AppendLine(string.Format("- Property: \"{0}\", Error: \"{1}\"",
                                            ve.PropertyName,
                                            ve.ErrorMessage));
            }
        }
        throw new DbEntityValidationException(sb.ToString(), e);
    }
}
5
répondu jocull 2013-11-22 16:02:41

intercepter l'exception dans un try catch et puis espion ou ctrl+d et ctrl+q et vous pouvez zoomer sur les EntityValidationErrors.

5
répondu Brandon.Staley 2014-01-07 13:24:07

la réponse de @Slauma est vraiment grande, mais j'ai trouvé que ça ne marchait pas quand une propriété de ComplexType était invalide.

par exemple, vous avez un bien Phone du type complexe PhoneNumber . Si la propriété AreaCode est invalide, le nom de la propriété dans ve.PropertyNames Est" téléphone.L'indicatif régional". Cela fait échouer l'appel à eve.Entry.CurrentValues<object>(ve.PropertyName) .

pour corriger cela, vous pouvez diviser le nom de la propriété à chaque . , puis par le tableau résultant des noms de propriétés. Enfin, lorsque vous arrivez au bas de la chaîne, il vous suffit de retourner la valeur de la propriété.

ci-dessous est la classe FormattedDbEntityValidationException de @Slauma avec support pour les types complexes.

Profitez-en!

[Serializable]
public class FormattedDbEntityValidationException : Exception
{
    public FormattedDbEntityValidationException(DbEntityValidationException innerException) :
        base(null, innerException)
    {
    }

    public override string Message
    {
        get
        {
            var innerException = InnerException as DbEntityValidationException;
            if (innerException == null) return base.Message;

            var sb = new StringBuilder();

            sb.AppendLine();
            sb.AppendLine();
            foreach (var eve in innerException.EntityValidationErrors)
            {
                sb.AppendLine(string.Format("- Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
                    eve.Entry.Entity.GetType().FullName, eve.Entry.State));
                foreach (var ve in eve.ValidationErrors)
                {
                    object value;
                    if (ve.PropertyName.Contains("."))
                    {
                        var propertyChain = ve.PropertyName.Split('.');
                        var complexProperty = eve.Entry.CurrentValues.GetValue<DbPropertyValues>(propertyChain.First());
                        value = GetComplexPropertyValue(complexProperty, propertyChain.Skip(1).ToArray());
                    }
                    else
                    {
                        value = eve.Entry.CurrentValues.GetValue<object>(ve.PropertyName);
                    }
                    sb.AppendLine(string.Format("-- Property: \"{0}\", Value: \"{1}\", Error: \"{2}\"",
                        ve.PropertyName,
                        value,
                        ve.ErrorMessage));
                }
            }
            sb.AppendLine();

            return sb.ToString();
        }
    }

    private static object GetComplexPropertyValue(DbPropertyValues propertyValues, string[] propertyChain)
    {
        var propertyName = propertyChain.First();
        return propertyChain.Count() == 1 
            ? propertyValues[propertyName] 
            : GetComplexPropertyValue((DbPropertyValues)propertyValues[propertyName], propertyChain.Skip(1).ToArray());
    }
}
5
répondu mikesigs 2015-09-30 05:46:33

je jette juste mes deux cents...

dans ma dbConfiguration.cs, j'aime envelopper mon contexte.La méthode SaveChanges () dans un try/catch et produire un fichier texte de sortie qui me permet de lire les erreurs clairement, et ce code les chronomètre aussi - pratique si vous rencontrez plus d'une erreur à des moments différents!

        try
        {
            context.SaveChanges();
        }
        catch (DbEntityValidationException e)
        {
            //Create empty list to capture Validation error(s)
            var outputLines = new List<string>();

            foreach (var eve in e.EntityValidationErrors)
            {
                outputLines.Add(
                    $"{DateTime.Now}: Entity of type \"{eve.Entry.Entity.GetType().Name}\" in state \"{eve.Entry.State}\" has the following validation errors:");
                outputLines.AddRange(eve.ValidationErrors.Select(ve =>
                    $"- Property: \"{ve.PropertyName}\", Error: \"{ve.ErrorMessage}\""));
            }
            //Write to external file
            File.AppendAllLines(@"c:\temp\dbErrors.txt", outputLines);
            throw;
        }
4
répondu IfElseTryCatch 2017-04-03 14:05:51

ce que j'ai trouvé...quand J'ai eu L'erreur "EntityValidationErrors" c'est ça....j'ai un champ dans ma base de données " db1 "dans la table "tbladdress" comme "address1" qui a une taille de 100 (I. E adresse varchar (100) null) et je passais la valeur plus de 100 caractères..et cela conduit à l'erreur tout en sauvegardant des données dans la base de données....

vous devez donc vérifier les données que vous transmettez au champ.

4
répondu Dharmendra Prajapati 2017-07-28 09:36:24

ça me va.

var modelState = ModelState.Values;
if (!ModelState.IsValid)
{
    return RedirectToAction("Index", "Home", model);
}

mettez un point d'arrêt sur la déclaration if. Ensuite, vous pouvez vérifier modelState dans les fenêtres de débogage. Sur chaque valeur vous pouvez voir s'il y a une erreur et même le message d'erreur. C'est tout. Lorsque vous n'en avez plus besoin, supprimez ou commentez la ligne.

j'espère que cela aidera.

si demandé, je peux fournir screenshot détaillé dans la fenêtre de débogage.

3
répondu AngelDown 2016-05-23 19:26:49

comme mentionné dans d'autres messages, il suffit de saisir l'exception dans la classe DbEntityValidationException. Qui vous donnera watever-vous pendant les cas d'erreur.

 try
 {
  ....
 }
 catch(DbEntityValidationException ex)
 {
  ....
 }
3
répondu Mayank 2016-07-21 04:26:07

j'ai fait face à cette erreur avant

quand j'ai essayé de mettre à jour le champ spécifique dans mon modèle dans entity framwork

Letter letter = new Letter {ID = letterId, ExportNumber = letterExportNumber,EntityState = EntityState.Modified};
LetterService.ChangeExportNumberfor(letter);
//----------


public int ChangeExportNumber(Letter letter)
    {
        int result = 0;
        using (var db = ((LettersGeneratorEntities) GetContext()))
        {
            db.Letters.Attach(letter);
            db.Entry(letter).Property(x => x.ExportNumber).IsModified = true;
            result += db.SaveChanges();
        }
        return result;
    }

et selon les réponses ci-dessus

j'ai trouvé le message de Validation The SignerName field is required.

qui pointent vers le champ dans mon modèle

et quand j'ai vérifié mon schéma de base de données j'ai trouvé

enter image description here

alors coure ValidationException a son droit de soulever

et en fonction de ce domaine, je veux qu'il soit nullable, (je ne sais pas comment j'ai foiré)

donc j'ai changé ce champ pour permettre Null, et par ceci mon code ne me donnera plus cette erreur

donc cette erreur peut se produire si vous invalider L'intégrité de vos données de votre base de données

2
répondu Basheer AL-MOMANI 2017-05-23 11:47:31

veuillez vérifier la valeur des champs que vous passez, sont valides et en fonction des champs de la base de données. Par exemple, le nombre de caractères passés dans un champ particulier est inférieur aux caractères définis dans le champ Table de la base de données.

2
répondu arun tiwari 2018-01-07 03:24:18

si vous utilisez IIS avec Authentification Windows et Entity Framework , faites attention à utiliser authorize .

j'ai essayé de POST sans autorisation et ça n'a pas marché, et j'ai eu cette erreur sur db.SaveChangesAsync(); , alors que tous les autres verbes GET et DELETE fonctionnaient.

mais quand J'ai ajouté AuthorizeAttribute comme annotation, ça a marché.

[Authorize]
public async Task<IHttpActionResult> Post(...){
....
}
1
répondu Toodoo 2018-06-18 12:56:26

vérifiez si vous avez Not Null contrainte dans vos colonnes de tableau et vous ne passez pas la valeur pour cette colonne pendant les opérations d'insertion/mise à jour. Cela provoque cette exception dans le cadre de l'entité.

0
répondu s Jagathish 2018-06-08 11:32:20