Ich versuche, meine Userroles Tabelle zu aktualisieren, aber es wird nicht aktualisiert. Ich versuche, zwei Dinge zu aktualisieren: 1. die E-Mail 2. die Benutzerrolle. Da das Update in 2 Tabellen erfolgen muss, verwende ich zwei separate Befehle. Wenn ich das Update auf der E-Mail allein (Benutzer) ausführen, funktioniert es, aber wenn ich die Rolle (AspUserRoles) aktualisiere, tut es nichts. Wenn ich beides ausführe, funktioniert es auch nicht, weil UserRoles.Attach (userRole) die Aktualisierung verhindert. Ich bekomme auch keine Fehler.Kann nicht mit .Attach() aktualisieren
überprüfte ich, wenn ApplicationRole.Id und ApplicationUser.Id einen Wert hat, und es macht den Wert zurück, ich will.
Hier ist mein UserController.cs:
public async Task<IActionResult> Edit(UserViewModel model, Guid id)
{
var alert = new Alert();
try
{
if(!ModelState.IsValid)
{
alert.Message = alert.ExceptionMessage = ApplicationDbContextMessage.INVALID;
throw new Exception();
}
var originalModel = ApplicationDbContext.Users.FirstOrDefault(u => u.Id == id);
var userRole = ApplicationDbContext.UserRoles.FirstOrDefault(i => i.UserId == id);
if(originalModel == null)
{
alert.Message = alert.ExceptionMessage = ApplicationDbContextMessage.NOTEXISTS;
throw new Exception();
}
originalModel.Email = model.ApplicationUser.Email;
userRole.RoleId = model.ApplicationRole.Id;
ApplicationDbContext.Users.Attach(originalModel);
ApplicationDbContext.UserRoles.Attach(userRole);
ApplicationDbContext.Entry(originalModel).State = EntityState.Modified;
if (await ApplicationDbContext.SaveChangesAsync() == 0)
{
alert.Message = alert.ExceptionMessage = ApplicationDbContextMessage.EDITNOK;
throw new Exception();
}
alert.Message = ApplicationDbContextMessage.EDITOK;
return RedirectToAction("Index");
}
catch(Exception ex)
{
alert.Type = AlertType.Error;
alert.ExceptionMessage = ex.Message;
model = await ViewModel(model.ApplicationUser);
ModelState.AddModelError(string.Empty, alert.ExceptionMessage);
}
return View(model);
}
Sie sollten nicht aufrufen müssen 'Attach' für diese Objekte, werden sie aus dem gleichen Zusammenhang kommen sie gespeichert sind, und sie nie die Verbindung unterbrochen wird. Hast du das probiert, ohne "Attach" oder "EntityState" zu nennen? –
Ich habe und es funktioniert nicht. Als ich hinzufügen kann (Userrole) statt Attach (Userrole) es hat eine neue Zeile in der Tabelle Userrole hinzufügen, aber dann habe ich eine dublicate mit dem gleichen Benutzer-ID ... – hxwtch
Sie brauchen nicht 'Add' entweder zu nennen. Ändern Sie einfach die Eigenschaften und rufen Sie SaveChanges im Kontext auf. Sie sollten in der Lage sein, Ihren ursprünglich geposteten Code zu übernehmen, die 2 Zeilen, die 'Attach' sagen, und die Zeile, die den' State' ändert, zu entfernen. –