UserRolesテーブルを更新しようとしていますが、更新されません。私は2つのことを更新しようとしている:1.電子メール2.ユーザーの役割。更新は2つのテーブルで行う必要があるため、2つの別々のコマンドを使用しています。私は電子メール(ユーザー)だけで更新プログラムを実行すると、それは動作しますが、私はロール(AspUserRoles)を更新しても何もしません。 UserRoles.Attach(userRole)が更新を妨げているため、どちらも動作しません。私もエラーはありません。.Attach()で更新できません。
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'をつぶすことなしにこれを試しましたか? –
私はやったし、動作しません。 Attach(userRole)の代わりにAdd(userRole)を実行すると、UserRoleテーブルに新しい行が追加されますが、同じUserIdを持つdublicateがあります。 – hxwtch
'Add 'を呼び出す必要はありません。プロパティを変更し、コンテキスト上で 'SaveChanges'を呼び出してください。あなたは元の投稿されたコードを取り、 'Attach'と言う2行と' State'を変更する行を削除して動作させることができます。 –