如何使用实体框架 6 更新具有唯一列的表条目

问题描述

我有一个这样的类模型:

public class Perfil
{
        [Key]
        public int ID { get; set; }
        public DateTime FechaCreacion { get; set; }
        [Index(IsUnique = true)]
        public Modelo.Enumeraciones.ERoles Rol { get; set; }
        public string Descripcion { get; set; }
}

我正在尝试使用此代码仅更新一个条目:(contexto 是我的 dbContext)

public async Task<IHttpActionResult> Put(int id,[FromBody]Models.Usuarios.Perfil value)
{
            if (id != value.ID) {
                return InternalServerError(new Exception("id de URL: "+id+ " no coincide con el del objeto enviado en el cuerpo: " + value.ID));
            }

            Models.Usuarios.Perfil perfil = contexto.Perfiles.SingleOrDefault(a => a.ID == id);

            if (EqualityComparer<Models.Usuarios.Perfil>.Default.Equals(perfil,default(Models.Usuarios.Perfil)))
            {
                return InternalServerError(new Exception("No existe un registro con id " + id + " en la tabla de perfiles."));
            }

            perfil.Descripcion = value.Descripcion;
            perfil.Rol = value.Rol;

            await contexto.SaveChangesAsync();

            return Ok(id);
}

出于任何原因,我收到此错误

System.Data.sqlClient.sqlException: Cannot insert duplicate key row in object 'dbo.Perfils' with unique index 'IX_Rol'. The duplicate key value is (3).

我知道添加的任何条目都必须具有唯一的角色。问题是我不是要插入!!,我想更新条目的 rol 和描述属性。我只用表中的一个条目来测试这个,我想更新它。

我已经测试了很多事情,例如更改条目的状态以修改或附加条目。其中一些测试在 db 中插入一个新条目,在表中给我两个条目。我不明白为什么条目没有更新。我认为这个麻烦是由于 Unique 列 Rol 引起的。

解决方法

我终于知道发生了什么。我应该在问题中告诉我这个方法是从一个单元测试项目中执行的。我按以下顺序执行:

  • 发布
  • 获取
  • 更新
  • 删除

此外,整个操作都在 [TestMethod] 内。似乎使用发布的相同对象进行放置会使实体认为有两个对象附​​加到它。这就是为什么一些测试给我两个插入的结果。解决方案是将 Post、Get、Update 和 Delete 拆分为一个 [TestMethod]。