当我不想修改一个属性时,它不起作用,对 ef core 的问题

When i want don't modified one Attributes,It's not work,question for ef core

我不想修改为 null 或空的用户密码,
我搜索了很长时间,但没有用
你能给我一些建议吗?

public async Task<IActionResult> Edit(int ID, [Bind("UserId,UserPassword,Username,Fullname,Nickname,Sex,Status,Email,Tel,Mobile,Address,Province,City,PostCode,UserType")] User user)
    {
        if (ID != user.UserId)
        {
            return NotFound();
        }
        if (ModelState.IsValid)
        {
            
                if (string.IsNullOrEmpty(user.UserPassword))
                {
                    context.Attach(user);
                    context.Entry(user).Property("UserPassword").IsModified = false;
                }
                else
                {
                user.UserPassword = main.Md5(user.UserPassword);
                }
                context.Update(user);
                await context.SaveChangesAsync();
            
            return RedirectToAction(nameof(Index));
        }
        return View(user);
    }

这是cshtml enter image description here

不要在您的操作中接收用户,而是创建一个视图模型并使用它来更新您的用户信息。

示例:

public class UserViewModel {

 public string UserId { get; set; }

 public string UserPassword { get; set;}

 ... // other properties
}

public async Task <IActionResult> Edit(int ID, UserViewModel viewModel) {
 if (ID != viewModel.UserId) {
  return NotFound();
 }
 if (ModelState.IsValid) {
  var user = context.Users.FindAsync(viewModel.UserId);
  user.Password = !string.IsNullOrEmpty(viewModel.Password) ? main.Md5(viewModel.Password) : user.Password;
  // update other properties here

  await context.SaveChangesAsync();

  return RedirectToAction(nameof(Index));
 }
 return View(user);
}

试试下面的代码:

context.Update(user);
context.Entry<User>(user).Property(x => x.UserPassword).IsModified = false;
context.SaveChanges();

Update 方法将所有属性标记为已修改,您应该在它之后更改 IsModified 的状态。

可以参考https://github.com/dotnet/efcore/issues/6849