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).
Haben Sie versucht, in der ersten Zeile von AddUserAccount() einen Unterbrechungspunkt zu setzen, um sicherzustellen, dass newUser Werte enthält? – Eric
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
Setzen Sie einen Breakpoint vor dem zweiten 'db.SaveChanges()' und überprüfen Sie, ob der 'UP.UserLoginID' den korrekten Wert hat. – AnhTriet