【问题标题】:Integrity Constraint Violation When Attaching to Delete附加到删除时违反完整性约束
【发布时间】:2012-08-06 19:01:21
【问题描述】:

我已经完成了一直困扰所有人的那个小时编辑器。我现在只需要让它删除一些东西:批发时间安排删除或删除 ExceptionHoursSets(一般时间模式的例外)。每个 ExceptionHoursSet 都有一个 WeekSpec,而 WeekSpec 又具有 DaySpecs 的集合(包含当天的小时数)。所以我显然想遍历每个异常集,并删除已标记为删除的天、周和集。这是缩写的方法:

    [HttpPost]
    public ActionResult Edit(Schedule schedule, [Bind(Prefix = "ExceptionHoursSet")] List<ExceptionHoursSet> exceptionHoursSets)
    {
        using (var db = new HoursDb())
        {
            ViewBag.DayNames = HomeServices.DayNames;
            if (ModelState.IsValid)
            {
                schedule.ExceptionHoursSets = exceptionHoursSets;
                foreach (var exceptionHoursSet in exceptionHoursSets)
                {
                    if (!exceptionHoursSet.IsDeleting)
                    {
                        exceptionHoursSet.WeekSpecId = exceptionHoursSet.WeekSpec.WeekSpecId;
                            // for coherency (should this be necessary?)

                        foreach (var daySpec in exceptionHoursSet.WeekSpec.DaySpecs)
                        {
                            db.Entry(daySpec).State = EntityState.Modified;
                            db.SaveChanges();
                        }
                        db.Entry(exceptionHoursSet.WeekSpec).State = EntityState.Modified;
                        db.SaveChanges();

                        db.Entry(exceptionHoursSet).State = EntityState.Modified;
                        db.SaveChanges();
                    }
                    else
                    {
                        var daySpecs = new List<DaySpec>(exceptionHoursSet.WeekSpec.DaySpecs);

                        db.ExceptionHoursSets.Attach(exceptionHoursSet);
                        db.WeekSpecs.Attach(exceptionHoursSet.WeekSpec);
                        foreach (var daySpec in daySpecs)
                        {
                            db.DaySpecs.Attach(daySpec);
                            db.DaySpecs.Remove(daySpec);
                        }
                        db.WeekSpecs.Remove(exceptionHoursSet.WeekSpec);
                        db.ExceptionHoursSets.Remove(exceptionHoursSet);

                        db.SaveChanges();
                    }
                }

                if (HasEditedException(lastExceptionHoursSet))
                {
                    var dayNum = 0;
                    foreach (var daySpec in lastExceptionHoursSet.WeekSpec.DaySpecs)
                    {
                        daySpec.DayNum = dayNum++;
                        daySpec.DaySpecId = Guid.NewGuid();
                        db.DaySpecs.Add(daySpec);
                    }
                    lastExceptionHoursSet.WeekSpec.WeekSpecId = Guid.NewGuid();
                    db.WeekSpecs.Add(lastExceptionHoursSet.WeekSpec);
                    lastExceptionHoursSet.ExceptionHoursSetId = Guid.NewGuid();
                    exceptionHoursSets.Add(lastExceptionHoursSet);
                    db.ExceptionHoursSets.Add(lastExceptionHoursSet);
                }

                db.Entry(schedule).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            return View(schedule);
        }
    }

尝试附加到我尝试删除的 exceptionHoursSet 时遇到的错误是:

发生了参照完整性约束冲突:定义参照约束的属性值在关系中的主体对象和依赖对象之间不一致。

这是什么?更重要的是,我该如何摆脱它?

感谢您容忍我, 内森·邦德

【问题讨论】:

    标签: asp.net-mvc ef-code-first


    【解决方案1】:

    好的,找到了。首先,我需要附上异常集所属的时间表。然后我在该附件中遇到了同样的错误,但这是因为我没有做一些事情来将事情集成到 Schedule 的 props 中,这些工作是在我从上面的清单中缩写出来的代码中完成的。本质上,我还有一个用于 Schedule 的 WeekSpec 属性以及包含一般时间模式的异常集。当我从视图中获取 Schedule 参数时,Schedule 有它的 ID 和它的一般时间 WeekSpec,它也有它自己的 ID。然而,Schedule 的 WeekSpec 外键没有设置;只有在我将其设置为 WeekSpec 的 ID 之后,我才能有效地附加。所以,我所要做的就是在这个 ID 匹配之后将附表附件代码移到,一切正常。抱歉问了一个愚蠢的问题。

    【讨论】:

      猜你喜欢
      • 2019-01-02
      • 1970-01-01
      • 2012-11-27
      • 2020-01-14
      • 2017-11-26
      • 2021-12-13
      • 2017-10-01
      • 2019-04-12
      相关资源
      最近更新 更多