我正在尝试编辑用户实体。
当密码字段留空时,我希望密码在数据库中保持不变。但是如果用户输入新密码,我希望它能够更新它。
我尝试在数据库中获取密码,以防密码字段留空。但是我收到以下错误:
ObjectStateManager中已存在具有相同键的对象。 ObjectStateManager无法跟踪具有相同对象的多个对象 键。
public ActionResult Edit([Bind(Include = "Id,Nombre,Apellido,Password,RepeatPassword,IdRol,Email,Activo,ResetPassword,Username, Imagen, OldPassword")] Usuario usuario) {
try {
string OldPassword = db.Usuarios.Find(usuario.Id).Password;
var password = "";
if (String.IsNullOrEmpty(usuario.Password) && String.IsNullOrEmpty(usuario.RepeatPassword)) {
password = OldPassword;
if (ModelState.ContainsKey("Password")) ModelState["Password"].Errors.Clear();
if (ModelState.ContainsKey("RepeatPassword")) ModelState["RepeatPassword"].Errors.Clear();
} else {
password = usuario.RepeatPassword;
password = Encryption.EncryptPassword(password);
}
if (ModelState.IsValid) {
usuario.Password = password;
usuario.RepeatPassword = password;
db.Entry(usuario).State = System.Data.Entity.EntityState.Modified;
db.SaveChanges();
Sesion.Messages.Add(new UserMessage() {
Type = MessageType.success, Message = "El Usuario se editó exitosamente"
});
return RedirectToAction("Index");
}
ViewBag.RolesList = new SelectList(db.Roles, "Id", "Nombre");
return View(usuario);
} catch (Exception ex) {
Log.LogException(ex, ControllerContext);
return RedirectToAction("Index");
}
}
有什么想法吗?
答案 0 :(得分:0)
如果要更新现有元素,则应遵循以下模式:
1)使用Id
从存储库中获取元素2)更新获得元素的修改字段
3)保存元素
这种方式实体框架不会尝试创建具有相同Id的新元素。
在您的情况下,您应该替换
string OldPassword = db.Usuarios.Find(usuario.Id).Password;
...
与
var oldUser = db.Usuarios.Find(usuario.Id);
oldUser.Password = ...<new values>...
db.Entry(oldUser).State = System.Data.Entity.EntityState.Modified; //I thinks this is not required...
db.SaveChanges();