2014-02-06 11 views
11

Meine app wird folgende Fehlermeldung:Wie behandelt man System.Data.Entity.Validation.DbEntityValidationException?

An exception of type 'System.Data.Entity.Validation.DbEntityValidationException' occurred in EntityFramework.dll but was not handled in user code

Additional information: Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.

ich diese Fehlermeldung erhalten, wenn Sie einen neuen Benutzer zu registrieren versuchen. Fehler tritt auf 'db.SaveChanges()'

Hier ist der 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: Benutzermodellklasse

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; } 

    } 
} 

Wie kann ich damit umgehen?

Antwort

13

Es gibt eine Art Validierung der Datenbank, die Sie daran hindert, die Daten zu schreiben.

Die Lösung bereits auf dieser Seite angegeben ist:

Validation failed for one or more entities. See 'EntityValidationErrors' property for more details

Als zusätzliche Anmerkung dazu, wie Sie .net Mvc verwenden Sie System.Diagnostics.Debug.WriteLine() anstelle von Console verwenden sollten .Writeline() und dies wird beim Debuggen in das Debug-Ausgabefenster geschrieben. Sie können nicht in die Konsole schreiben, wenn Sie ein mvc-Projekt ausführen.

1

Das Passwort Länge in der DB und das Modell muss> = sein, dass die Länge von encrpPass.

3

Obwohl es bereits eine akzeptierte Antwort gibt, könnte meine Erfahrung wahrscheinlich jemandem in der Zukunft helfen. Für einen schnellen Test können Sie die Daten überprüfen, die Sie in der Datei Configuration.cs in die Datenbank eingeben, und dann in Model können Sie die Validierungsbedingungen überprüfen. Zum Beispiel in meinem Fall würde ich folgende Validierungsbedingung in einem Modell setzen:

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

Und dann, in der Configuration.cs den Preis Zuordnung zu sein:

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

Dies schaffte EntityFrameworkExceptions und verhindern Datenbank aus dem Seeding.

1

Überprüfen Sie die Größe der Datenbankfelder, in denen Sie Daten speichern möchten. Das Ändern eines Felds von varchar (50) nach varchar (max) hat mich überzeugt.

Wenn Sie Entity Framework verwenden, müssen Sie möglicherweise die Tabelle löschen und hinzufügen, an der Sie Änderungen vorgenommen haben.

19

Um diesen Fehler zu beheben, können wir die SaveChanges() -Methode des DatabaseContext-Objekts im try-Block und in der Catch-Schleife durch jeden Fehler umbrechen, um herauszufinden, wo der Fehler liegt. Der Code geht unter.

 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); 
       } 
      } 
     } 

Sobald der Fehler gefunden wird, können Sie daran arbeiten, um es zu beheben. Hoffe es hilft. Danke

+1

ich wünsche, ich könnte dieser Antwort mehr als eine Stimme geben – khurram

2

Sie können die SaveChanges überschreiben, um diese Ausnahme zu behandeln und bessere Ausnahmedetails zu bieten.

Sie können eine Klasse "next" zu Ihrer Kontextklasse erstellen ...der vollständige Code für diese Klasse ist wie folgt:

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); 
       } 
      } 
     } 
    } 

prüft dieses für weitere Informationen: http://devillers.nl/blog/improving-dbentityvalidationexception/

Verwandte Themen