如何避免通过更新保存重复值

How to avoid saving of duplicated value by update

我正在尝试通过重复检查来实现更新功能。 到目前为止,我可以检查我的数据库中是否有一些重复项,但是通过更新记录,我可以将 2 个重复项插入到数据库中,只有当我尝试添加第三个时,才会出现错误。

有谁知道如何检查更新值并在保存之前显示消息是否存在重复?

我的 MVC 控制器:

[HttpPost]
    public JsonResult UpdateEvent(int id, Event e)
    {

        using (EventsDBEntities db = new EventsDBEntities())
        {
            Event eupt = db.Events.Where(x => x.Id == id).FirstOrDefault();
            List<Event> evts = db.Events.Where(x => x.Title == e.Title).ToList();
            
            if(evts.Count > 1)
            {
                return Json(new { data = e, success = false, error = "Order number already exists" }, JsonRequestBehavior.AllowGet);
                
            }
            eupt.Title = e.Title;
            eupt.Description = e.Description;
            eupt.Location = e.Location;
            eupt.color = e.color;
            eupt.fullDescription = e.fullDescription;
            eupt.Address = e.Address;
            eupt.Contact = e.Contact;
            eupt.FbFSE = e.FbFSE;
            eupt.FbMat = e.FbMat;
            eupt.FbDel = e.FbDel;
            eupt.FbCinfo = e.FbCinfo;
            eupt.FbTask = e.FbTask;
            eupt.FbCsutisfact = e.FbCsutisfact;
            eupt.Comments = e.Comments;
            eupt.TaskType = e.TaskType;
            db.SaveChanges();
        }
        return Json(new { data = e, success = true }, JsonRequestBehavior.AllowGet);

    }

如果我将设置if(evts.Count > 0),我将无法更新我的记录,但如果设置为if(evts.Count > 1),则可以添加 2 个相同的值。有人可以帮助我吗?

解决这个问题最明显的方法当然是简单地在 Title-column 上定义一个 UNIQUE 约束。这就是我通常期望实现这种要求的方式。让数据库为所欲为。

但是,如果你真的想在你的代码中这样做,如果你更新除了你的标题之外的所有内容,

List<Event> evts = db.Events.Where(x => x.Title == e.Title).ToList();

将为您获取要更新的记录。这不是您想要的,因为您想要所有具有此类标题的记录,除了您要更新的记录。另外,考虑使用有意义的变量名,避免在不需要时将其强制转换为列表:

var duplicate = db.Events.Where(x => x.Id != id && x.Title == e.Title).Any();

现在你if-statement变成self-explaining:

if(duplicate)
{
    return Json(new { data = e, success = false, error = "Order number already exists" }, JsonRequestBehavior.AllowGet);
}

附带说明,您检查了重复的 标题,但告诉用户重复的订单号。这似乎很奇怪...