我試圖更新我的UserRoles表,但它不會更新。我試圖更新兩件事:1.電子郵件2.用戶角色。因爲更新需要在兩個表中進行,所以我使用了兩個單獨的命令。當我單獨運行電子郵件更新(用戶)時,它的工作原理,但如果我更新角色(AspUserRoles),它什麼都不做。當我運行它時,它都不起作用,因爲UserRoles.Attach(userRole)阻止它更新。我也沒有錯誤。無法更新。安裝()
我檢查了ApplicationRole.Id和ApplicationUser.Id是否有值,它確實返回了我想要的值。
這裏是我的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);
}
您不應該在這些對象上調用'Attach',它們來自它們保存的相同上下文,並且它們永遠不會斷開連接。你是否嘗試過這種方式,而不調用'Attach'或者搞亂'EntityState'? –
我做了,它不起作用。當我做Add(userRole)而不是Attach(userRole)時,它確實在UserRole表中添加了一個新行,但是我有一個具有相同UserId的dublicate ... – hxwtch
你不需要調用'Add'。只需更改屬性,並在上下文中調用「SaveChanges」。你應該能夠拿到你原來的發佈代碼,刪除2個表示'Attach'的行,以及改變'State'的行,並讓它工作。 –