首页 > 解决方案 > 如何避免通过更新保存重复值

问题描述

我正在尝试使用重复检查来实现更新功能。到目前为止,我可以检查我的数据库中是否有一些重复项,但是通过更新记录,我可以将 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 个相同的值。有人可以帮助我吗?

标签: c#asp.netasp.net-mvcasp.net-mvc-4duplicates

解决方案


解决这个问题的最明显方法当然是简单地在标题列上定义一个 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 语句变得不言自明:

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

在旁注中,您检查重复的Title,但告诉用户重复的Order number。这似乎很奇怪...


推荐阅读