J'ai cette erreur lors de l'amorçage de ma base de données avec la première approche de code.
La validation a échoué 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 modèle précédent, mais j'ai apporté quelques modifications que j'explique ci-dessous:
- J'avais une énumération appelée Status, je l'ai changé en une classe appelée Status
- J'ai changé la classe ApplicantsPositionHistory pour avoir 2 clés étrangères vers la même table
Excusez-moi pour le code long, mais je dois tout coller. L'exception est levé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:\Users\LUIS.SIMBIOS\Documents\Visual Studio 2010\Projects\SlnHR\HRRazorForms\Content\pictures\1.jpg")
};
Applicant john = new Applicant()
{
name = "John",
skypeuser = "jo.valencia",
telephone = "3435343543",
photo = File.ReadAllBytes(@"C:\Users\LUIS.SIMBIOS\Documents\Visual Studio 2010\Projects\SlnHR\HRRazorForms\Content\pictures\2.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
}
}
}
la source
Console.WriteLine
, j'estime que plus de gens écrivent des projets web que des applications console de nos jours, etDebug.Write
travaille dans les deux ...Vous pouvez le faire à partir de Visual Studio pendant le débogage sans écrire de code, pas même un bloc catch.
Ajoutez simplement une montre avec le nom:
L'expression de surveillance
$exception
affiche toute exception levée dans le contexte actuel, même si elle n'a pas été interceptée et affectée à une variable.Basé sur http://mattrandle.me/viewing-entityvalidationerrors-in-visual-studio/
la source
Cela pourrait en fait le faire sans avoir à écrire du code:
Dans votre bloc catch, ajoutez un point d'arrêt à la ligne de code suivante:
Maintenant, si vous passez la souris sur
exception
ou ajoutez-le àWatch
, puis accédez aux détails de l'exception comme indiqué ci-dessous; vous verrez quelle (s) colonne (s) particulière (s) est / sont à l'origine du problème car cette erreur se produit généralement lorsqu'une contrainte de table est violée.Grande image
la source
Voici comment vous pouvez vérifier le contenu des EntityValidationErrors dans Visual Studio (sans écrire de code supplémentaire), c'est-à-dire pendant le débogage dans l' EDI .
Le problème?
Vous avez raison, le menu contextuel Afficher les détails du débogueur Visual Studio n'affiche pas les erreurs réelles dans la
EntityValidationErrors
collection.La solution!
Ajoutez simplement l'expression suivante dans une fenêtre Quick Watch et cliquez sur Réévaluer .
((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors
Dans mon cas, voyez comment je peux me développer à l'
ValidationErrors
List
intérieur de laEntityValidationErrors
collectionRéférences: article de blog mattrandle.me , réponse de @ yoel
la source
Pour un moyen rapide de voir la première erreur sans même ajouter une montre, vous pouvez coller ceci dans la fenêtre immédiate:
la source
Pour tous ceux qui travaillent dans
VB.NET
la source
Pendant que vous êtes en mode débogage dans le
catch {...}
bloc, ouvrez la fenêtre "QuickWatch" ( ctrl+ alt+ q) et collez-y:((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 d'exception.
Cela vous permettra de forer dans l'
ValidationErrors
arbre. C'est le moyen le plus simple que j'ai trouvé pour obtenir un aperçu instantané de ces erreurs.la source
Si vous interceptez simplement une exception générique, il peut être avantageux de la convertir en exception DbEntityValidationException . Ce type d'exception possède une propriété Erreurs de validation, et en continuant à vous y développer, vous trouverez tous les problèmes.
Par exemple, si vous placez un point d'arrêt dans la prise, vous pouvez jeter les éléments suivants dans une montre:
Un exemple d'erreur est si un champ n'autorise pas les valeurs nulles et que vous avez une chaîne nulle, vous verrez qu'il indique que le champ est obligatoire.
la source
vérifiez simplement la longueur du champ de votre table de base de données. Votre texte d'entrée est supérieur à la longueur du type de données du champ de colonne
la source
Dans le débogage, vous pouvez entrer cela dans votre champ de saisie d'évaluateur d'expression QuickWatch:
la source
La réponse de @Slauma est vraiment géniale, mais j'ai trouvé que cela ne fonctionnait pas lorsqu'une propriété ComplexType n'était pas valide.
Par exemple, supposons que vous ayez une propriété
Phone
de type complexePhoneNumber
. Si laAreaCode
propriété n'est pas valide, le nom de la propriété dansve.PropertyNames
est "Phone.AreaCode". Cela provoque l'eve.Entry.CurrentValues<object>(ve.PropertyName)
échec de l'appel .Pour résoudre ce problème, vous pouvez diviser le nom de la propriété à chaque fois
.
, puis réexaminer le tableau de noms de propriétés résultant. Enfin, lorsque vous arrivez en bas de chaîne, vous pouvez simplement restituer la valeur de la propriété.Vous trouverez ci-dessous la
FormattedDbEntityValidationException
classe de @ Slauma avec prise en charge des ComplexTypes.Prendre plaisir!
la source
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.la source
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 gérera (et donc connectera notre journal des erreurs!) Ce genre d'exceptions.
la source
J'ai dû écrire ceci dans la fenêtre Exécution: 3
afin d'approfondir l'erreur exacte!
la source
En utilisant la réponse de @Slauma, j'ai créé un extrait de code (un entourage avec extrait) pour une meilleure utilisation.
la source
Attrapez l'exception dans une tentative de capture, puis une surveillance rapide ou ctrl + d & ctrl + q et vous pouvez explorer les EntityValidationErrors.
la source
Je jette juste mes deux cents ...
Dans mon dbConfiguration.cs, j'aime encapsuler ma méthode context.SaveChanges () dans un try / catch et produire un fichier texte de sortie qui me permet de lire clairement les erreurs, et ce code les horodate également - pratique si vous rencontrer plus d'une erreur à des moments différents!
la source
Ce que j'ai trouvé ... quand j'ai eu l'erreur 'EntityValidationErrors' c'est que .... j'ai un champ dans ma base de données 'db1' dans la table 'tbladdress' comme 'address1' qui a une taille de 100 (ie adresse varchar (100) null) et je passais une valeur de plus de 100 caractères .. et cela conduisait à une erreur lors de l'enregistrement des données dans la base de données ....
Vous devez donc vérifier les données que vous transmettez sur le terrain.
la source
not null
colonnes, donc une fois que j'ai ajouté des données à tous les éléments avant ma,db.SaveChanges()
je n'ai reçu aucune erreur.Cela fonctionne pour moi.
Mettez un point d'arrêt sur l'instruction 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 ça. Lorsque vous n'en avez plus besoin, supprimez ou commentez simplement la ligne.
J'espère que cela vous aidera.
Si demandé, je peux fournir une capture d'écran détaillée dans la fenêtre de débogage.
la source
Comme mentionné dans d'autres articles, interceptez simplement l'exception dans la classe DbEntityValidationException. Ce qui vous donnera l'eau dont vous avez besoin pendant les cas d'erreur.
la source
J'ai fait face à cette erreur avant
quand j'ai essayé de mettre à jour un champ spécifique dans mon modèle dans le cadre de l'entité
et selon les réponses ci-dessus
J'ai trouvé le message de validation
The SignerName field is required.
qui pointant vers le champ dans mon modèle
et quand j'ai vérifié mon schéma de base de données, j'ai trouvé
donc hors coure
ValidationException
a le droit de souleveret selon ce champ, je veux qu'il soit nul, (je ne sais pas comment je l'ai gâché)
donc j'ai changé ce champ pour autoriser Null, et par cela mon code ne me donnera plus cette erreur
la source
DbEntityValidationException
augmentée.Veuillez vérifier la valeur des champs que vous transmettez, sont valides et selon les champs de la base de données. Par exemple, le nombre de caractères transmis dans un champ particulier est inférieur aux caractères définis dans le champ de table de base de données.
la source
Si vous utilisez IIS avec l' authentification Windows et Entity Framework , soyez prudent
authorize
.J'ai essayé de
POST
sans mon autorisation et cela n'a pas fonctionné, et obtenir cette erreurdb.SaveChangesAsync();
, alors que tous les autres verbesGET
etDELETE
travaillaient.Mais quand j'ai ajouté AuthorizeAttribute comme annotation, cela a fonctionné.
la source
Voici une autre façon de le faire au lieu d'utiliser des boucles foreach pour regarder à l'intérieur d'EntityValidationErrors. Bien sûr, vous pouvez formater le message à votre guise:
la source
Dans mon cas, c'était parce que la longueur du champ de la base de données est inférieure à la longueur du champ d'entrée.
table de base de données
Ma contribution
la valeur de
Username
length
est 5 qui estlessthan
6... cela peut aider quelqu'un
la source
Vérifiez si vous avez des
Not Null
contraintes dans vos colonnes de table et si vous ne transmettez pas la valeur de cette colonne lors des opérations d'insertion / mise à jour. Cela provoque cette exception dans le cadre d'entité.la source
J'ai également rencontré le même problème. J'ai mis à jour mon .edmx à partir de la base de données après que l'exception a disparu.
la source
Cette erreur se produit principalement en raison de la taille du champ. VÉRIFIEZ toutes les tailles de champ dans une table de base de données.
la source
A également eu du mal avec cette erreur et sur la base du sujet ici et cette réponse a pu comprendre un extrait à copier / coller sans avoir besoin de comprendre ce qui doit être importé (excellent pour les débutants C #), code ci-dessous:
la source