无法从数据库中获取实体数据

时间:2015-07-23 15:09:26

标签: asp.net-mvc entity-framework-6

我正在尝试编辑用户实体。

当密码字段留空时,我希望密码在数据库中保持不变。但是如果用户输入新密码,我希望它能够更新它。

我尝试在数据库中获取密码,以防密码字段留空。但是我收到以下错误:

  

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");
    }
}

有什么想法吗?

1 个答案:

答案 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();