2016-05-06 12 views
0

Fehlermeldung:„Die INSERT-Anweisung in Konflikt mit der FOREIGN KEY-Einschränkung

The INSERT statement conflicted with the FOREIGN KEY constraint "FK_UserProfile_UserLogin". The conflict occurred in database "ToDoDB", table "dbo.UserLogin", column 'UserLoginID'. The statement has been terminated.

Was könnte das bedeuten

Ich versuche, eine einfache Anmeldung und Profil MVC5 Web-App zu bauen Ich habe meine?. . in SQL Express Tabelle

zum einen ist hier mein Modell für die Anmeldeseite:

public class UserSignUp 
{ 
    [Key] 
    public int UserLoginID { get; set; } 

    //Foregin key for the login table - First name, last name, creation date, and email 
    public int UserProfileID { get; set; } 

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

    [Required(ErrorMessage = "Password is required")] 
    [Display(Name = "Password")] 
    public string Password { get; set; } 

    [Required(ErrorMessage = "First Name is required")] 
    [Display(Name = "First Name")] 
    public string FirstName { get; set; } 

    [Required(ErrorMessage = "Last Name is required")] 
    [Display(Name = "Last Name")] 
    public string LastName { get; set; } 

    [DataType(DataType.DateTime)] 
    public DateTime CreationDate { get; set; } 

    [Required(ErrorMessage = "Valid email is required")] 
    [DataType(DataType.EmailAddress)] 
    public string Email { get; set; } 
} 

So ist die UserLoginID der Primärschlüssel aus der UserLogin Tabelle und die UserProfileID ist die primäre aus der UserProfile Tabelle. Ich setze den Fremdschlüssel der Tabelle UserProfile von UserLogin auf UserLoginID.

Hier ist mein Modell einen neuen Benutzer für die Erstellung von:

public class UserProfileManager 
{ 
    public void AddUserAccount(UserSignUp newUser) 
    { 
     // create database connection 
     using (ToDoDBEntities db = new ToDoDBEntities()) 
     { 
      // Collect viewmodel data 
      // Here building goes by object type and not foregin key relationship 
      UserLogin UL = new UserLogin(); 
      UL.Username = newUser.Username; 
      UL.Password = newUser.Password; 

      // Add the UserLogin object I just built to the database 
      db.UserLogins.Add(UL); 
      db.SaveChanges(); 

      UserProfile UP = new UserProfile(); 
      // establish connection to UL by establishing foreign key relationship 
      UP.UserLoginID = newUser.UserLoginID; 
      UP.FirstName = newUser.FirstName; 
      UP.LastName = newUser.LastName; 
      UP.CreationDate = newUser.CreationDate; 
      UP.Email = newUser.Email; 

      // Add UserProfile object to databse and save changes 
      db.UserProfiles.Add(UP); 
      db.SaveChanges(); 
     } 
    } 

    //Check if user is real before login is allowed 
    public bool isLoginReal(string LoginName) 
    { 
     using (ToDoDBEntities DB = new ToDoDBEntities()) 
     { 
      // Return the user from the DB whose login name matches the LoginName string passed in as perameter 
      return DB.UserLogins.Where(o => o.Username.Equals(LoginName)).Any(); 
     } 
    } 
} 

Mein AddUserAccount ist, wo ich denke, dass ich Probleme habe. Also fange ich damit an, das UserLogin Objekt zu erstellen und der Datenbank hinzuzufügen und zu speichern. Das scheint tatsächlich zu funktionieren. Aber der nächste Schritt, in dem ich das Objekt UserProfile erstelle, hinzufüge und speichere, scheint nicht zu funktionieren. Zumindest die Datenbank wird nicht aktualisiert.

Hier ist die Steuerung der Aktionen Handhabung:

public class AccountController : Controller 
{ 
    // GET: Account 
    public ActionResult Index() 
    { 
     return View(); 
    } 

    #region signup methods 
    // Get method for signup page 
    public ActionResult SignUpPage() 
    { 
     return View(); 
    } 

    // Post method for signup page - post to db 
    [HttpPost] 
    // Pass in the UserSign up model object to be built 
    public ActionResult SignUpPage(UserSignUp USUV) 
    { 
     // Form is filled out and then method is entered 
     if (ModelState.IsValid) 
     { 
      // Form is filled out and database connection is established if form is valid 
      UserProfileManager UPM = new UserProfileManager(); 

      if (!UPM.isLoginReal(USUV.Username)) 
      { 
       // data access . adduseraccount from entity manager (where model objects are built) 
       UPM.AddUserAccount(USUV); 
       FormsAuthentication.SetAuthCookie(USUV.FirstName, false); 
       return RedirectToAction("Welcome", "Home"); 
      } 
      else 
      { 

      } 
     } 
     return View(); 
    } 
    #endregion 
} 

Zu meinem (Noob) Auge alles sieht gut aus. Die SignUpPage wird empfangen, dann wird ein neues UserSignUp-Objekt an die Post-Aktion übergeben, und das Entitätsrahmenobjekt (UserProfileManager) wird erstellt, das Formular wird authentifiziert und der Benutzer wird entweder zur Welcome-Ansicht umgeleitet oder der Benutzer kehrt zur Anmeldungsansicht zurück .

Kann mir jemand helfen, herauszufinden, was ich vermisse oder falsch mache? Ich habe ein Bild des Datenbankentwurfs als Referenz eingefügt (ich weiß noch weniger über Datenbank und MVC).

Database design

+0

Haben Sie versucht, in der ersten Zeile von AddUserAccount() einen Unterbrechungspunkt zu setzen, um sicherzustellen, dass newUser Werte enthält? – Eric

+0

Ok jetzt gibt es mir einen Fehler: "Die INSERT-Anweisung im Konflikt mit der FOREIGN KEY-Einschränkung" FK_UserProfile_UserLogin ". Der Konflikt trat in der Datenbank" ToDoDB ", Tabelle" dbo.UserLogin "Spalte" UserLoginID ". Die Anweisung wurde beendet "Was könnte das bedeuten? – Devon

+0

Setzen Sie einen Breakpoint vor dem zweiten 'db.SaveChanges()' und überprüfen Sie, ob der 'UP.UserLoginID' den korrekten Wert hat. – AnhTriet

Antwort

0

Ah ja, nachdem das Problem hier ist:

UP.UserLoginID = newUser.UserLoginID; 

Es ist nicht newUser, sollte es sein:

UP.UserLoginID = UL.UserLoginID; 

Weil Sie nur das Objekt UL der Datenbank hinzugefügt Um die generierte ID des eingefügten Objekts zu erhalten, müssen Sie es aufrufen, nicht das Objekt newUser.

+0

youre erstaunlich. Das war es schließlich. Ich danke dir sehr. Die DB hat sich vollständig aktualisiert, aber jetzt erhalte ich einen HTTP-Fehler 401.0 - Nicht autorisiert. Es wird nicht auf die Ansicht "Willkommen" umgeleitet. Ist das wegen der [authorize] Anmerkung, die ich für die "Willkommen" Ansicht habe? – Devon

+0

Ja, überprüfen Sie Ihren Authentifizierungsprozess :) – AnhTriet

+0

Ich wünschte, ich könnte Ihnen eine Million Upvotes geben. Jetzt muss ich nur herausfinden, wie ich eine weitere Tabelle zu meiner Datenbank und allen damit verbundenen Steuerelementen hinzufügen kann – Devon

Verwandte Themen