web-dev-qa-db-fra.com

Comment gérer les exceptions System.Data.Entity.Validation.DbEntityValidationException?

Mon application obtient l'erreur suivante:

Une exception de type 'System.Data.Entity.Validation.DbEntityValidationException' s'est produite dans EntityFramework.dll mais n'a pas été traité dans le code utilisateur

Informations complémentaires: La validation a échoué pour une ou plusieurs entités . Voir la propriété 'EntityValidationErrors' pour plus de détails.

Je reçois cette erreur en essayant d'enregistrer un nouvel utilisateur. Une erreur se produit sur 'db.SaveChanges ()'

Voici le code:

public ActionResult Registration(x.Models.User user)
        {
            if(ModelState.IsValid)
            {
                using(var db = new xDBEntities1())
                {
                    var crypto = new SimpleCrypto.PBKDF2();
                    var encrpPass = crypto.Compute(user.password);
                    var sysUser = db.users.Create();

                    sysUser.email = user.email;
                    sysUser.username = user.username;
                    sysUser.password = encrpPass;
                    sysUser.premium_credits = 0;
                    sysUser.login_times = 0;
                    sysUser.last_ip = Request.ServerVariables["REMOTE_ADDR"];
                    sysUser.creation_ip = Request.ServerVariables["REMOTE_ADDR"];
                    sysUser.banned = 0;
                    sysUser.creation_date = DateTime.Now;
                    sysUser.creation_time = DateTime.Now.TimeOfDay;

                    db.users.Add(sysUser);
                    db.SaveChanges();
                }
            }
            return RedirectToAction("Index", "Home");
        }

edit: Classe de modèle utilisateur

public class User
    {
        [Required]
        [StringLength(50)]
        [Display(Name="Username: ")]
        public String username { get; set; }
        [Required]
        [DataType(DataType.Password)]
        [StringLength(50,MinimumLength=6)]
        [Display(Name="Password: ")]
        public string password { get; set; }
        [Required]
        [EmailAddress]
        [StringLength(50)]
        public string email { get; set; }
        public int phonenumber { get; set; }
        public int mobilephonenumber { get; set; }

    }
}

Comment puis-je le gérer?

11
user2545576

Il existe une sorte de validation de base de données en cours qui vous empêche d’écrire les données dans celle-ci. 

La solution est déjà indiquée sur cette page:

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

En guise de remarque supplémentaire lorsque vous utilisez .net mvc, vous devez utiliser System.Diagnostics.Debug.WriteLine () au lieu de Console.Writeline () et cela écrira dans la fenêtre de sortie du débogage lorsque vous déboguez. Comme vous ne pouvez pas écrire sur la console lorsque vous exécutez un projet MVC.

13
Sebastian

Pour résoudre cette erreur, nous pouvons encapsuler la méthode SaveChanges () de l'objet DatabaseContext dans le bloc try et dans la boucle Catch dans chacune des erreurs pour déterminer où se trouve l'erreur. Le code va en dessous.

        try
        {
            db.SaveChanges();
        }
        catch (DbEntityValidationException ex)
        {
            foreach (var entityValidationErrors in ex.EntityValidationErrors)
            {
                foreach (var validationError in entityValidationErrors.ValidationErrors)
                {
                    Response.Write("Property: " + validationError.PropertyName + " Error: " + validationError.ErrorMessage);
                }
            }
        }

Une fois que l'erreur est trouvée, vous pouvez travailler dessus pour la corriger . J'espère que cela vous aidera. Merci 

23
RAVI VAGHELA

Vous pouvez remplacer la SaveChanges pour gérer cette exception et fournir de meilleurs détails sur celle-ci.

Vous pouvez créer une classe "suivante" dans votre classe de contexte ... le code complet pour cette classe est le suivant:

using System.Data.Entity;
using System.Data.Entity.Validation;
using System.Linq;

namespace MyNamespace
    {
        public partial class MyContext : DbContext
        {
            // Override base SaveChanges to expand out validation errors so client gets an actually helpful message
            public override int SaveChanges()
            {
                try
                {
                    return base.SaveChanges();
                }
                catch (DbEntityValidationException ex)
                {
                    // Retrieve the error messages as a list of strings.
                    var errorMessages = ex.EntityValidationErrors
                    .SelectMany(x => x.ValidationErrors)
                    .Select(x => x.ErrorMessage);

                    // Join the list to a single string.
                    var fullErrorMessage = string.Join("; ", errorMessages);

                    // Combine the original exception message with the new one.
                    var exceptionMessage = string.Concat(ex.Message, " The validation errors are: ", fullErrorMessage);

                    // Throw a new DbEntityValidationException with the improved exception message.
                    throw new DbEntityValidationException(exceptionMessage, ex.EntityValidationErrors);
                }
            }
        }
    }

Cochez cette case pour plus d'informations: http://devillers.nl/blog/improving-dbentityvalidationexception/

3
Romias

Même s'il existe déjà une réponse acceptée, mon expérience pourrait probablement aider quelqu'un à l'avenir. Pour un test rapide, vous pouvez vérifier les données que vous entrez dans la base de données dans le fichier Configuration.cs, puis dans Modèle, vous pouvez vérifier les conditions de validation. Par exemple, dans mon cas, je mettrais la condition de validation suivante dans un modèle:

[Range(1, 100),DataType(DataType.Currency)]
public decimal Price { get; set; }

Et ensuite, dans Configuration.cs, attribuer le prix comme suit:

new Photo{
    Title = "Photo 2",
    DateTaken = DateTime.Parse("2013-6-15"),
    Genre = "Nature",
    CameraModel = "Canon",
    Price = 200
}

Ceci a créé EntityFrameworkExceptions et a empêché l’ensemencement de la base de données.

3
user3941146

Vérifiez la taille des champs de la base de données dans lesquels vous essayez de sauvegarder des données. Changer un champ de varchar (50) en varchar (max) a été très utile. 

Si vous utilisez Entity Framework, vous devrez peut-être supprimer et ajouter le tableau sur lequel vous avez apporté des modifications. 

1
stink

La longueur du mot de passe dans la base de données et le modèle doit être> = que la longueur de encrpPass.

1
Source007