附加到删除时的完整性约束违例

时间:2012-08-06 19:01:22

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

我已经完成了那个小时编辑,我一直在讨论所有人。我现在只需要删除它:删除批量小时计划或删除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时得到的错误是:

发生了引用完整性约束违规:定义引用约束的属性值在关系中的主体和从属对象之间不一致。

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

谢谢你忍受我, 内森邦德

1 个答案:

答案 0 :(得分:0)

是的,找到了。首先,我需要附上计划,例外集是其中的一部分。然后我得到了相同的附件错误,但这是因为我没有做一些将事情集成在Schedule的道具中的事情,我在上面的列表中缩写的代码完成的工作。从本质上讲,我还有一个WeekSpec属性用于Schedule和异常集,它包含一般的小时模式。当我从视图中获得Schedule参数时,Schedule具有其ID和一般小时WeekSpec,它也有自己的ID。但是,没有设置Schedule的WeekSpec的外键;只有在我将其设置为WeekSpec的ID之后才能有效地附加。所以,我所要做的就是在这个ID匹配之后移动Schedule附件代码,并且一切都是白银。对不起,这是一个愚蠢的问题。