3

Ich verwende ASP.NET Identity 2 in einem MVC 5 Projekt und ich möchte Student Daten mit UserManager.Update() Methode aktualisieren. Da ich jedoch von ApplicationUser Klasse erben, muss ich Student zu ApplicationUser zuordnen, bevor Update-Methode aufgerufen wird. Wenn ich andererseits den Ansatz nutze, den ich auch für die Erstellung eines neuen Schülers verwendet habe, liegt ein Fehler aufgrund von Nebenläufigkeit vor, da ich eine neue Instanz anstelle einer Aktualisierung erstelle. Da mir langweilig ist, das Problem mit AutoMapper zu lösen, brauche ich eine stabile Lösung, um das Problem ohne AutoMapper zu lösen. Könnten Sie mir bitte erklären, wie Sie dieses Problem lösen können? Ich übergebe die StudentViewModel an die Update-Methode im Controller und dann muss ich es auf Student und dann an die UserManager.Update() Methode als ApplicationUser übergeben. Auf der anderen Seite frage ich mich, ob ich das Passwort auf der Controller-Stufe abrufen und senden sollte, anstatt es aus Sicherheitsgründen an View zu übergeben. Könnten Sie mich auch über dieses Problem informieren (während des Benutzerupdates aktualisiere ich das Passwort nicht und ich muss das Passwort des Benutzers in der Datenbank behalten). Jede Hilfe wäre willkommen.Benutzer von UserManager.Update() in ASP.NET Identity 2 aktualisieren

Entitätsklassen:

public class ApplicationUser : IdentityUser<int, ApplicationUserLogin, 
            ApplicationUserRole, ApplicationUserClaim>, IUser<int> 
{ 
    public string Name { get; set; } 
    public string Surname { get; set; } 
    //code omitted for brevity 
} 

public class Student: ApplicationUser 
{  
    public int? Number { get; set; } 
} 


Controller:

[HttpPost] 
[ValidateAntiForgeryToken] 
public JsonResult Update([Bind(Exclude = null)] StudentViewModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     ApplicationUser user = UserManager.FindById(model.Id); 

     user = new Student 
     { 
      Name = model.Name, 
      Surname = model.Surname, 
      UserName = model.UserName, 
      Email = model.Email, 
      PhoneNumber = model.PhoneNumber, 
      Number = model.Number, //custom property 
      PasswordHash = checkUser.PasswordHash 
     }; 

     UserManager.Update(user); 
    } 
} 
+0

helfen Sind Sie benutzerdefinierte Tabelle mit Student und mit Microsoft Identity zum Einfügen von Daten in Schülertisch ?? –

+0

Nein, ich benutze nur die gleiche Tabelle (** AspNetUsers **) und meine Student-Entität erbt von ApplicationUser. Gibt es eine klügere Lösung als die Antwort? –

+0

Eigentlich habe ich mit diesem Szenario zu kämpfen: http: //stackoverflow.com/questions/39304464/how-to-save-new-record-with-hashed-password-in-my-custom-table-instead-of-aspnet –

Antwort

14

Es gibt keine Notwendigkeit, die student als ApplicationUser zum UserManager.Update() Methode zu übergeben (bec ause Student Klasse erbt (daher ist) ApplicationUser).

Das Problem mit Ihrem Code ist, dass Sie new Student Operator verwenden, so erstellen Sie einen neuen Schüler, anstatt den vorhandenen zu aktualisieren.

den Code wie folgt ändern:

// Get the existing student from the db 
var user = (Student)UserManager.FindById(model.Id); 

// Update it with the values from the view model 
user.Name = model.Name; 
user.Surname = model.Surname; 
user.UserName = model.UserName; 
user.Email = model.Email; 
user.PhoneNumber = model.PhoneNumber; 
user.Number = model.Number; //custom property 
user.PasswordHash = checkUser.PasswordHash; 

// Apply the changes if any to the db 
UserManager.Update(user); 
+0

Lieber Ivan, vielen Dank für deine Hilfe. Eigentlich habe ich es genauso versucht, wie du es erwähnt hast, aber in diesem Fall ist das Problem: In der Benutzerinstanz gibt es keine Number-Eigenschaft. Aus diesem Grund musste ich diese Instanz in Student umwandeln (um auf die Number-Eigenschaft zuzugreifen). Auf der anderen Seite, ja, für die Aktualisierung ist es ein Fehler, eine neue Instanz zu erstellen, anstatt die aktuelle zu verwenden. Aber keine Möglichkeit, das Problem zu lösen :(Irgendwelche andere Lösung? Ich habe eine Lösung dieses Problems seit Tagen, aber keine richtige Lösung gesucht: ((( –

+0

) Dann kann das Problem mit dem UserManager sein. Ich fürchte, das ist außerhalb von Mein Wissensgebiet, vielleicht hilft Ihnen jemand anderes, viel Glück (Ich habe mein Bestes versucht, aber da ich nicht testen kann, glaube ich Ihnen, dass es nicht funktioniert, also werde ich die Antwort in wenigen Minuten löschen). –

+2

Löschen Sie die Antwort nicht. Ich habe das Problem mit Hilfe Ihrer wertvollen Hilfe gelöst. Ändern Sie einfach die erste Zeile als ** var user = UserManager.FindById (model.Id) als Student; ** in Ihrer Antwort :) Vielen Dank ... –

0

meine Antwort auf .netcore 1

diese Arbeit für meine, hoffe, ich kann sie

var user = await _userManager.FindByIdAsync(applicationUser.Id); 
        user.ChargeID = applicationUser.ChargeID; 
        user.CenterID = applicationUser.CenterID; 
        user.Name = applicationUser.Name; 
var result = await _userManager.UpdateAsync(user); 
Verwandte Themen