c# - MVC 删除删除不相关的数据

标签 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 中。
Schedule 包含一个 WeekSpec 来描述一般开放时间,以及一组 ExceptionHoursSets。
这些有 WeekSpecs 描述了上述一般时间的异常(exception)情况。

最佳答案

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

我认为这将是对关系使用级联删除选项并且不使用 foreach 删除所有子对象的正确解决方案。当然 - 只有当您 100% 确定没有时间表就不可能有 WeekSpecs/ExceptionHoursSet/DaySpecs 时才应该使用它。

关于c# - MVC 删除删除不相关的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11970125/

相关文章:

html - 在 html/css 中,是否有一个跨度 "cut off"而不是继续到另一行(并在视觉上显示截断?)

c# - 通过 SOAP 的 MVC 3 存储库模式

c# - 为什么 DataColumn.Caption 不起作用?

c# - 为什么我不能声明一个从 Byte 继承的枚举但我可以从 byte 继承?

c# - 使用 MVC 和 Web API 的 Ng-File-Upload - 不断获取 "404 Not Found"

c# - ASP MVC 在不查询数据库的情况下填充下拉列表的方法

asp.net-mvc-3 - MVC 3 - 具有 4 个参数的 RouteUrl

asp.net - 没有最大限制的StringLength

c# - Moonsharp pairs(...) 接下来引发异常 "bad argument #1 to ''(预期表,得到字符串)”

C# MongoDB 驱动程序 : Can't find the way to run complex query for AnyIn filter in MongoDB