0

Neu bei MVC. Wenn ich versuche, einen Benutzer der Datenbank-Datenbank unter Verwendung von Entity Framework hinzufügen Zuerst bekomme ich diese Ausnahme:database.SaveChanges() throws EntityValidationException

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. 

Dies ist der Code:

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Index(RegisterViewModel account) 
    { 
     if (ModelState.IsValid) 
     { 
      using (db) 
      { 
       bool duplicate = db.Users.Any(a => a.UserName == account.UserName); 

       if (duplicate) 
       { 
        ModelState.AddModelError("", "Username already exists in database!"); 
       } 
       else 
       { 
        db.Users.Add(new StoreFront.Models.User { UserName = account.UserName, Password = account.Password, EmailAddress = account.EmailAddress, IsAdmin = false, DateCreated = DateTime.Now }); 
        db.SaveChanges(); 

        ModelState.Clear(); 

        ModelState.AddModelError("RegisterSuccess", "Successfully registered!"); 
       } 
      } 
     } 
     return View(); 
    } 

Ich habe Validierung in meinem RegisterViewModel für alle Felder, und wenn ich debugge, ist IsValid = true, sonst würde es sowieso nicht laufen. Jede Hilfe würde sehr geschätzt werden ... Ich habe seit einiger Zeit damit zu kämpfen.

P.S. Ja, das Passwort wird derzeit als String gespeichert. Dies ist nur ein Testprojekt, das in der realen Welt nicht verwendet wird. Models Hinzugefügt:

EDIT

Benutzermodell aus Datenbank:

public partial class User 
    { 
     [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] 
     public User() 
     { 
      this.Addresses = new HashSet<Address>(); 
      this.Orders = new HashSet<Order>(); 
      this.ShoppingCarts = new HashSet<ShoppingCart>(); 
     } 

     public int UserID { get; set; } 
     public string UserName { get; set; } 
     public string Password { get; set; } 
     public string EmailAddress { get; set; } 
     public Nullable<bool> IsAdmin { get; set; } 
     public Nullable<System.DateTime> DateCreated { get; set; } 
     public string CreatedBy { get; set; } 
     public Nullable<System.DateTime> DateModified { get; set; } 
     public string ModifiedBy { get; set; } 

     [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
     public virtual ICollection<Address> Addresses { get; set; } 
     [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
     public virtual ICollection<Order> Orders { get; set; } 
     [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
     public virtual ICollection<ShoppingCart> ShoppingCarts { get; set; } 
    } 

Teilmodell hinzufügen ConfirmPassword:

namespace StoreFront.Models 
{ 
    [MetadataType(typeof(RegisterViewModel))] 
    public partial class User 
    { 
     [DisplayName("Confirm Password")] 
     [DataType(DataType.Password)] 
     [Compare("Password", ErrorMessage = "Passwords must match")] 
     public string ConfirmPassword { get; set; } 
    } 
} 

RegisterViewModel:

public class RegisterViewModel 
    { 
     public int UserID { get; set; } 

     [DisplayName("Username")] 
     [Required(ErrorMessage = "Username is required")] 
     public string UserName { get; set; } 

     [DisplayName("Password")] 
     [DataType(DataType.Password)] 
     [Required(ErrorMessage = "Password is required")] 
     public string Password { get; set; } 

     [DisplayName("Confirm Password")] 
     [DataType(DataType.Password)] 
     [Compare("Password", ErrorMessage = "Passwords must match")] 
     public string ConfirmPassword { get; set; } 

     [DisplayName("Email")] 
     [Required(ErrorMessage = "Email is required")] 
     [RegularExpression(@"^([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$", 
     ErrorMessage = "Please enter a valid email")] 
     public string EmailAddress { get; set; } 

     public Nullable<bool> IsAdmin { get; set; } 
     public Nullable<System.DateTime> DateCreated { get; set; } 
    } 
+2

allererst entfernen sollten Sie 'EntityValidationErrors Immobilie ansehen für mehr details' – Szer

+0

' ModelState.IsValid' zeigt an, dass Daten in 'RegisterViewModel' gültig ist. Zeigt jedoch nicht an, dass Daten in Ihrer Entität "User" gültig sind. – haim770

+0

Normalerweise dieser Fehler auf Ihrem Modellfeld beziehen sich nicht eingefügt properly.I schlage vor, Sie schauen in [dieser] (http://stackoverflow.com/questions/7795300/validation-failed-for-one-or-more-entities-see -entityvalidationerrors-property) .Basically tun Sie eine "try-catch" und die Fehlermeldung wird angezeigt, die angibt, was das Problem ist, das Sie daran hindern, in db einzufügen. –

Antwort

0

Fi x: Als ich ein Tutorial über MVC nachgeschlagen habe, bat ich sie, eine partielle Klasse und eine Meta-Klasse zu erstellen. Das war für Code zuerst ich glaube, der es im Grunde ein neues Feld machte, dass meine Datenbank keinen Platz hatte, und ich benutze Datenbank zuerst. Also entfernte ich die gelöschte partielle Klasse für den Benutzer und es hörte auf, ConfirmPassword zu einem tatsächlichen Feld in der Datenbank zu machen.

Sie die echten Werke es nicht wissen, oder ob das, was ich sagte Sinn macht, aber ich hoffe, dass dies schließlich jemand hilft.

0

[RegularExpression(@"^([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$", 
ErrorMessage = "Please enter a valid email")] 

von RegisterViewModel

Verwandte Themen