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?
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:
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.
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
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/
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.
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.
La longueur du mot de passe dans la base de données et le modèle doit être> = que la longueur de encrpPass.