0

Ich versuche, einen Wert aus dem Standard-MVC-Registrierungsformular (nämlich das E-Mail-Feld) einfügen, dies wird der Primärschlüssel und FK in einer anderen Tabelle sein. Meine Schüler-Tabelle enthält nur E-Mails. Ich möchte denselben Wert (E-Mail-Feld) eingeben, der bei der Registrierung in der Tabelle aspnetusers übergeben wird. Ich diesen Code geschrieben haben bisher:Einfügen in aspnetuser und Einfügen von Werten in eine andere Tabelle

var student = new Student { email = model.Email }; 

den Wert zuweisen und dann

db.Students.Add(student); 
db.SaveChanges(); 

die Aktion auszuführen, ich nehme an, dies in der Registrierung Controller erfolgt. Bitte geben Sie an, wenn ich es in den falschen Bereich platziert habe. Ich bin derzeit immer ein

Bitte siehe Code unten:

AccountController.cs

public async Task<ActionResult> Register(RegisterViewModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      var user = new ApplicationUser { UserName = model.Email, Email = model.Email }; 
      var student = new Student { email = model.Email }; 
      var result = await UserManager.CreateAsync(user, model.Password); 
      if (result.Succeeded) 
      { 

       string callbackUrl = await SendEmailConfirmationTokenAsync(user.Id, "Confirm your account"); 


       ViewBag.Message = "Check your email and confirm your account, you must be confirmed " 
           + "before you can log in."; 
       db.Students.Add(student); 
       db.SaveChanges(); 
       return View("Info"); 

       //return RedirectToAction("Index", "Home"); 
      } 
      AddErrors(result); 
     } 

     // If we got this far, something failed, redisplay form 
     return View(model); 
    } 

Student.cs

public class Student 
{ 
    [Key, ForeignKey("User")] 
    public string email { get; set; } 
    public virtual ApplicationUser User { get; set; } 
} 
+1

ich Sie nicht sehen, tun ' student.User = "überall. –

+0

Versuchen Sie auch, lesen [Primäre und Fremdschlüssel Einschränkungen] (https://msdn.microsoft.com/en-GB/library/ms179610.aspx) – Liam

Antwort

2

Ihr Fremdschlüssel hier ist auf der impliziten Tabelle c olum User_Id, die standardmäßig nicht nullfähig ist, und Sie haben keinen Wert für User festgelegt, um den Wert abzurufen. Anscheinend möchten Sie die E-Mail stattdessen als Fremdschlüssel verwenden, aber so funktionieren die Dinge nicht. Ein Fremdschlüssel verweist auf den Primärschlüssel der zugehörigen Tabelle, der für AspNetUsersId, nichtEmail ist. Selbst wenn Sie auf diese Weise tun könnten, wäre es eine extrem schlechte Idee. Email ist NVARCHAR (MAX), die nicht indiziert werden können.

Lange und kurze, die schnelle Lösung ist, einfach User auf dem Student Instanz festgelegt:

var student = new Student { email = model.Email, User = user }; 

Aber es wäre viel besser sein Erbe hier zu implementieren. Ein Student ist ein Benutzer, so eingestellt, dass es so hoch:

public class Student : ApplicationUser 

Dann müssen Sie nicht überhaupt irgendetwas davon benötigen. Durch die Erstellung eines Student wird automatisch ein ApplicationUser zugeordnet, weil es ein ApplicationUser ist.

UPDATE

Wenn vererben, nur nicht vergessen, dass Sie alle Eigenschaften auf ApplicationUser sind vererben, so müssen Sie nicht wieder hinzufügen Email und so. Wenn Sie den Benutzer aus dem Kontext ziehen, können Sie beispielsweise OfType<Student> verwenden, um nur Schüler zu erhalten. Wenn Sie die Standardimplementierung von ApplicationUserManager verwenden, gibt es immer ApplicationUser Instanzen zurück.da es aus jedoch UserManager<TUser> erbt, können Sie einfach diese Klasse ändern generic bleiben:

public class ApplicationUserManager<TUser> : UserManager<TUser> 
    where TUser : ApplicationUser 

alle vorhandenen Code modifizieren zu müssen, um zu vermeiden, können Sie auch eine nicht-generische Version der Klasse deklarieren:

Dann können Sie verschiedene Instanzen von ApplicationUserManager konstruieren, um mit den verschiedenen Arten von Benutzern zu arbeiten, die Sie haben. Da ApplicationUser Typ Ihre Basis ist, sollten Sie verwenden, wenn Sie mit alle Benutzer arbeiten müssen, wie für die Zwecke der allgemeinen Zeichen in.

+0

Ich habe versucht, die schnelle Lösung und es hat nicht funktioniert, gab einen Fehler Validierung fehlgeschlagen für eine oder mehrere Entitäten. Weitere Informationen finden Sie unter Eigenschaft 'EntityValidationErrors'. wenn es db.SaveChanges erreicht() ;, Ich bin mehr daran interessiert, in der Vererbungs Art und Weise du nach öffentlichen Klasse Schüler tun: ApplicationUser brauche ich noch etwas ändern? – Newbie

+0

Ich möchte auch sein, wenn sich jemand aufgrund seiner E-Mail-Adresse registriert und feststellt, ob es sich um einen Studenten oder Dozenten handelt, weshalb ich diesen Ansatz gewählt habe. Ist das möglich mit der Erbschaft? – Newbie

+0

Siehe Update oben. –

0

Wenn student.email ein FK, dann E-Mail muss sein existieren in db, um neuen Studenten hinzuzufügen

0

Student.cs nicht korrekt ist. Fremdschlüssel zeigt auf einen Primärschlüssel in einer anderen Tabelle.

Sie können Student.cs wie folgt bearbeiten:

public class Student 
{ 
    [Key] 
    public int StudentId { get; set; } 

    //Foreign key for User 
    [ForeignKey("User")] 
    public int UserId { get; set; } 
    public virtual ApplicationUser User { get; set; } 
} 

und wenn E-Mail einzigartige überprüfen Sie es auf der Benutzertabelle ist, wenn wie folgt registrieren:

public async Task<ActionResult> Register(RegisterViewModel model) 
{ 
    if (ModelState.IsValid) 
    { 
    var checkEMail = db.AspNetUsers.Where(a=>a.Email == model.Email).FirstOrDefault(); 
    if(checkEMail != null) 
     { 
      //Email is not valid 
     } 
    else 
    {    
      var user = new ApplicationUser { UserName = model.Email, Email = model.Email }; 
      var student = new Student { email = model.Email }; 
      var result = await UserManager.CreateAsync(user, model.Password); 
      if (result.Succeeded) 
      { 

       string callbackUrl = await SendEmailConfirmationTokenAsync(user.Id, "Confirm your account"); 


       ViewBag.Message = "Check your email and confirm your account, you must be confirmed " 
           + "before you can log in."; 
       db.Students.Add(student); 
       db.SaveChanges(); 
       return View("Info"); 

       //return RedirectToAction("Index", "Home"); 
      } 
      AddErrors(result); 
     } 

} 
Verwandte Themen