MVC删除删除不相关的数据

时间:2012-08-15 13:27:30

标签: c# asp.net-mvc asp.net-mvc-3 icollection

我试图删除一些数据(无论如何都会有多难?)但是每当我从模型对象中删除复杂类型的prop时,ICollection prop的内容也会混合。这是代码:

    [HttpPost, ActionName("Delete")]
    public ActionResult DeleteConfirmed(string name)
    {
        using (var db = new HoursDb())
        {
            db.Configuration.ProxyCreationEnabled = false;

            var schedule = db.Schedules.Where(s => s.ScheduleId == name)
                .Include(s => s.WeekSpec)
                .Include(s => s.WeekSpec.DaySpecs)
                .Include(s => s.ExceptionHoursSets)
                .Include(s => s.ExceptionHoursSets.Select(e => e.WeekSpec))
                .Include(s => s.ExceptionHoursSets.Select(e => e.WeekSpec.DaySpecs))
                .FirstOrDefault();
            if (schedule == null)
            {
                return View("404");
            }


            var daySpecs = new List<DaySpec>(schedule.WeekSpec.DaySpecs);
            foreach (var daySpec in daySpecs)
            {
                db.DaySpecs.Remove(daySpec);
            }
            db.WeekSpecs.Remove(schedule.WeekSpec);

            var exceptionHoursSets = new List<ExceptionHoursSet>(schedule.ExceptionHoursSets);
            foreach (var exceptionHoursSet in exceptionHoursSets)
            {
                daySpecs = new List<DaySpec>(exceptionHoursSet.WeekSpec.DaySpecs);
                foreach (var daySpec in daySpecs)
                {
                    db.DaySpecs.Remove(daySpec);
                    db.SaveChanges();
                }
                db.WeekSpecs.Remove(exceptionHoursSet.WeekSpec);
                db.SaveChanges();
                db.ExceptionHoursSets.Remove(exceptionHoursSet);
            }

            db.Schedules.Remove(schedule);
            db.SaveChanges();

            return RedirectToAction("Index");
        }
    }

在用

开火之前
db.WeekSpecs.Remove(schedule.WeekSpec);

ExceptionHoursSets有三个项目。删除WeekSpec后,它为零。呃。有什么想法吗?

更新

这是HoursDb类的代码:

using System.Data.Entity;
using LibraryAdmin.Models;
using System.Data.Entity.ModelConfiguration.Conventions;

namespace ####.DAL
{
    public class HoursDb : DbContext
    {
        public DbSet<DaySpec> DaySpecs { get; set; }
        public DbSet<WeekSpec> WeekSpecs { get; set; }
        public DbSet<ExceptionHoursSet> ExceptionHoursSets { get; set; }
        public DbSet<Schedule> Schedules { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        }
    }
}

此外,如果有帮助,DaySpecs包含通用建筑的开放和关闭时间;它们包含在WeekSpecs中。
该计划包含一个WeekSpec来描述一般的开放时间,以及一组ExceptionHoursSets。
其中有WeekSpecs描述了上述一般时间的例外情况。

2 个答案:

答案 0 :(得分:0)

我猜在数据库中为WeekSpec和ExceptionHoursSet之间的关系启用了级联删除选项。因此,当您删除WeekSpec时 - 删除ExceptionHoursSet中的相同WeekSpec,并且因为您有级联删除 - EF也会删除ExceptionHoursSet对象。

我认为这将是使用Cascade Delete选项进行关系的正确解决方案,并且不要使用foreach来删除所有子对象。当然 - 只有当你100%确定不能使用没有附表的WeekSpecs / ExceptionHoursSet / DaySpecs时,你才应该使用它。

答案 1 :(得分:0)

在初始化var调度之后将删除ExceptionHoursSets的foreach移动到前面,以及删除除最后一个db.SaveChanges之外的所有内容似乎都有效。我仍然不知道为什么会这样做,而我所拥有的却没有,所以任何额外的信息都会受到赞赏。