Ich habe der ApplicationUser
Klasse benutzerdefinierte Felder hinzugefügt.
Ich habe auch ein Formular erstellt, über das der Benutzer die Felder eingeben / bearbeiten kann.
Aus irgendeinem Grund kann ich die Felder in der Datenbank jedoch nicht aktualisieren.
[HttpPost]
[ActionName("Edit")]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Manage(EditProfileViewModel model)
{
if (ModelState.IsValid)
{
// Get the current application user
var user = User.Identity.GetApplicationUser();
// Update the details
user.Name = new Name { First = model.FirstName, Last = model.LastName, Nickname = model.NickName };
user.Birthday = model.Birthdate;
// This is the part that doesn't work
var result = await UserManager.UpdateAsync(user);
// However, it always succeeds inspite of not updating the database
if (!result.Succeeded)
{
AddErrors(result);
}
}
return RedirectToAction("Manage");
}
Mein Problem ähnelt den benutzerdefinierten Eigenschaften von MVC5 ApplicationUser , es scheint jedoch eine ältere Version von Identity zu verwenden, da die IdentityManager-Klasse anscheinend nicht vorhanden ist.
Kann mich jemand anleiten, wie man User
Informationen in der Datenbank aktualisiert ?
UPDATE: Wenn ich alle Felder in das Registerformular einbinde, werden alle Werte im entsprechenden Feld in einem neuen Datensatz der Users
Tabelle aus der Datenbank gespeichert.
Ich kann keine Änderungen an den Feldern eines vorhandenen Benutzers vornehmen (Zeile in der users
Tabelle). UserManager.UpdateAsync(user)
funktioniert nicht
Beachten Sie auch, dass mein Problem mehr identitätsorientiert ist als EntityFramework
ApplicationUser
. Die Namensfelder sind eine Spalte in der Datenbank (als Name_First, Name_Last und Name_NickName). Mein Problem ist, dass die Dateidatenbank beim Aufruf nicht mit den neuen Werten aktualisiert wirdUserManager.UpdateAsync(user)
. Ich möchte nur wissen, wie ich den ApplicationUser (Benutzertabelle) aktualisieren sollAntworten:
OK ... Ich habe stundenlang versucht herauszufinden, warum
userManager.updateAsync
die von uns bearbeiteten Benutzerdaten nicht beibehalten werden ... bis ich zu folgendem Ergebnis gekommen bin:Die Verwirrung ergibt sich aus der Tatsache, dass wir das
UserManager
in einer Zeile wie folgt erstellen :var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new MyDbContext()));
... dann verwenden wir,
manager.UpdateAsync( user );
aber das aktualisiert den Benutzer im Kontext, und dann müssen wir Änderungen am Datenbankkontext der Identität speichern. Die Frage ist also, wie der Identity DBcontext auf einfachste Weise abgerufen werden kann.Um dies zu lösen, sollten wir das nicht
UserManager
in einer Zeile erstellen ... und so mache ich es:var store = new UserStore<ApplicationUser>(new MyDbContext()); var manager = new UserManager(store);
dann nach dem Aktualisieren des Benutzers durch Aufrufen
manager.UpdateAsync(user);
dann gehst du zum Kontext
var ctx = store.context;
dann
ctx.saveChanges();
wahooooooo ... beharrte :)
Hoffe, das hilft jemandem, der ein paar Stunden an den Haaren gezogen hat: P.
quelle
await
Wenn Sie eines der Felder für ApplicationUser ODER IdentityUser null lassen, wird das Update als erfolgreich zurückgegeben, die Daten werden jedoch nicht in der Datenbank gespeichert.
Beispiellösung:
Fügen Sie die neu aktualisierten Felder hinzu:
model.Email = AppUserViewModel.Email; model.FName = AppUserViewModel.FName; model.LName = AppUserViewModel.LName; model.DOB = AppUserViewModel.DOB; model.Gender = AppUserViewModel.Gender;
Rufen Sie UpdateAsync auf
IdentityResult result = await UserManager.UpdateAsync(model);
Ich habe das getestet und es funktioniert.
quelle
IdentityResult result = await UserManager.UpdateAsync(model);
klein m für Modell seinIm OWIN-Kontext können Sie den Datenbankkontext abrufen. Scheint mir bisher gut zu funktionieren, und schließlich kam mir die Idee aus der ApplciationUserManager-Klasse, die dasselbe tut.
internal void UpdateEmail(HttpContext context, string userName, string email) { var manager = context.GetOwinContext().GetUserManager<ApplicationUserManager>(); var user = manager.FindByName(userName); user.Email = email; user.EmailConfirmed = false; manager.Update(user); context.GetOwinContext().Get<ApplicationDbContext>().SaveChanges(); }
quelle
await UserManager.UpdateAsync(user)
und die Änderung weiterhin besteht. Könnten Sie bitte bestätigen?Update()
Aufruf von innerhalb einer nicht asynchronen Hilfsfunktion) und dies ist die einzige Lösung, die mit dem Standard-Owin-Kontext funktioniert hat. Prost für die Rettung meines Tages und +1Der UserManager funktionierte nicht und wie @ Kevin Junghans schrieb,
Hier ist eine schnelle Lösung (vor den neuen Funktionen in ASP.net Identity v2), die ich in einem Webformular-Projekt verwendet habe. Das
class AspNetUser :IdentityUser
Wurde von SqlServerMembership aspnet_Users migriert. Und der Kontext ist definiert:
public partial class MyContext : IdentityDbContext<AspNetUser>
Ich entschuldige mich für die Reflexion und den synchronen Code. Wenn Sie dies in eine asynchrone Methode einfügen, verwenden Sie diese
await
für die asynchronen Aufrufe und entfernen Sie die Aufgaben und Wait (). Das Argument, Requisiten, enthält die Namen der zu aktualisierenden Eigenschaften.public static void UpdateAspNetUser(AspNetUser user, string[] props) { MyContext context = new MyContext(); UserStore<AspNetUser> store = new UserStore<AspNetUser>(context); Task<AspNetUser> cUser = store.FindByIdAsync(user.Id); cUser.Wait(); AspNetUser oldUser = cUser.Result; foreach (var prop in props) { PropertyInfo pi = typeof(AspNetUser).GetProperty(prop); var val = pi.GetValue(user); pi.SetValue(oldUser, val); } Task task = store.UpdateAsync(oldUser); task.Wait(); context.SaveChanges(); }
quelle
Ich hatte auch Probleme mit UpdateAsync bei der Entwicklung einer Version von SimpleSecurity , die ASP.NET Identity verwendet. Zum Beispiel habe ich eine Funktion hinzugefügt, mit der ein Kennwort zurückgesetzt werden kann, um den Benutzerinformationen ein Kennwortrücksetz-Token hinzuzufügen. Zuerst habe ich versucht, UpdateAsync zu verwenden, und es wurden die gleichen Ergebnisse erzielt wie bei Ihnen. Am Ende habe ich die Benutzerentität in ein Repository-Muster eingewickelt und zum Laufen gebracht. Sie können sich das SimpleSecurity-Projekt als Beispiel ansehen . Nachdem Sie mehr mit ASP.NET Identity gearbeitet haben (Dokumentation ist noch nicht vorhanden), denke ich, dass UpdateAsync das Update nur in den Kontext festschreibt. Sie müssen den Kontext noch speichern, damit es in die Datenbank übernommen wird.
quelle
Ich habe die Funktionalität auf die gleiche Weise ausprobiert und wenn ich die
UserManager.Updateasync
Methode aufrufe, ist sie erfolgreich, aber es gibt kein Update in der Datenbank. Nachdem ich einige Zeit verbracht hatte, fand ich eine andere Lösung, um die Daten inaspnetusers
der folgenden Tabelle zu aktualisieren :1) Sie müssen eine
UserDbContext
Klasse erstellen , die von einerIdentityDbContext
Klasse wie folgt erbt :public class UserDbContext:IdentityDbContext<UserInfo> { public UserDbContext(): base("DefaultConnection") { this.Configuration.ProxyCreationEnabled = false; } }
2) Aktualisieren Sie dann im Account Controller die Benutzerinformationen wie folgt:
UserDbContext userDbContext = new UserDbContext(); userDbContext.Entry(user).State = System.Data.Entity.EntityState.Modified; await userDbContext.SaveChangesAsync();
Wo
user
ist Ihre aktualisierte Entität?hoffe das wird dir helfen.
quelle
Ausgezeichnet!!!
IdentityResult result = await UserManager.UpdateAsync(user);
quelle
Basierend auf Ihrer Frage und auch im Kommentar vermerkt.
Ja, der Code ist korrekt für die Aktualisierung
ApplicationUser
der Datenbank.IdentityResult result = await UserManager.UpdateAsync(user);
UserManager<ApplicationUser> UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));
quelle
ModelState.IsValid
?Das funktioniert bei mir. Ich verwende Identity 2.0. GetApplicationUser scheint nicht mehr vorhanden zu sein.
var user = await UserManager.FindByIdAsync(User.Identity.GetUserId()); if (!string.IsNullOrEmpty(form["FirstName"])) { user.FirstName = form["FirstName"]; } if (!string.IsNullOrEmpty(form["LastName"])) { user.LastName = form["LastName"]; } IdentityResult result = await UserManager.UpdateAsync(user);
quelle
GetApplicationUser()
ist eine benutzerdefinierte ErweiterungsmethodeIch verwende den neuen EF & Identity Core und habe das gleiche Problem mit dem Zusatz, dass ich diesen Fehler habe:
Mit dem neuen DI-Modell habe ich dem Controller des Konstruktors den Kontext zur DB hinzugefügt.
Ich habe erfolglos versucht, den Konflikt zu erkennen
_conext.ChangeTracker.Entries()
undAsNoTracking()
meine Anrufe zu ergänzen.Ich muss nur den Status meines Objekts ändern (in diesem Fall Identität).
_context.Entry(user).State = EntityState.Modified; var result = await _userManager.UpdateAsync(user);
Und arbeitete ohne ein anderes Geschäft oder Objekt und Mapping zu erstellen.
Ich hoffe, jemand anderes ist nützlich meine zwei Cent.
quelle
Ich verwende .Net Core 3.1 oder eine höhere Version. Bitte folgen Sie der Lösung:
public class UpdateAssignUserRole { public string username { get; set; } public string rolename { get; set; } public bool IsEdit { get; set; } } private async Task UpdateSeedUsers(UserManager<IdentityUser> userManager, UpdateAssignUserRole updateassignUsername) { IList<Users> Users = await FindByUserName(updateassignUsername.username); if (await userManager.FindByNameAsync(updateassignUsername.username) != null) { var user = new IdentityUser { UserName = updateassignUsername.username, Email = Users[0].Email, }; var result = await userManager.FindByNameAsync(updateassignUsername.username); if (result != null) { IdentityResult deletionResult = await userManager.RemoveFromRolesAsync(result, await userManager.GetRolesAsync(result)); if (deletionResult != null) { await userManager.AddToRoleAsync(result, updateassignUsername.rolename); } } } }
quelle
Fügen Sie Ihrer Datei Startup.Auth.cs unter dem statischen Konstruktor den folgenden Code hinzu:
UserManagerFactory = () => new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())); OAuthOptions = new OAuthAuthorizationServerOptions { TokenEndpointPath = new PathString("/Token"), Provider = new ApplicationOAuthProvider(PublicClientId, UserManagerFactory), AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"), AccessTokenExpireTimeSpan = TimeSpan.FromDays(14), AllowInsecureHttp = true };
Mit der Codezeile für die UserManagerFactory-Einstellung können Sie Ihren benutzerdefinierten DataContext mit dem UserManager verknüpfen. Sobald Sie dies getan haben, können Sie eine Instanz des UserManager in Ihrem ApiController abrufen und die UserManager.UpdateAsync (Benutzer) -Methode funktioniert, da sie Ihren DataContext verwendet, um die zusätzlichen Eigenschaften zu speichern, die Sie Ihrem benutzerdefinierten Anwendungsbenutzer hinzugefügt haben.
quelle