删除时“修改了集合;枚举操作可能无法执行”错误

时间:2015-12-03 12:46:12

标签: c# asp.net-mvc database crud

我正在MVC 5 CRUD中执行删除功能。

这是我确认时删除的代码:

  [HttpPost, ActionName("DeleteFaculty")]
        public ActionResult DeleteFacultyConfirmed(int id = 0)
        {

            CS.Models.faculty fac = db.faculties.Find(id);
            foreach (var sched in fac.schedentries)
            {
                fac.schedentries.Remove(sched);
            }
            db.faculties.Remove(fac);
            db.SaveChanges();
            return RedirectToAction("DeletedFaculty", "Home");
        }

以下是我要完全删除的课程

public class faculty
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int faculty_id { get; set; }
    public string faculty_name { get; set; }

    public string faculty_lname { get; set; }

    public string faculty_email { get; set; }

    public string faculty_password { get; set; }

    public string faculty_dept { get; set; }

    public virtual ICollection<sched> schedentries { get; set; }
}

这里是我要删除的那个类是以下的外键:

public class sched
{

    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int sched_id { get; set; }
    public string sched_day { get; set; }

    public TimeSpan sched_stime { get; set; }

    public TimeSpan sched_etime { get; set; }

    public int faculty_id { get; set; }

    public virtual faculty faculty { get; set; }
}

这是我的数据背景:

 public class CSdbConnectionString : DbContext
    {
        public CSdbConnectionString()
        : base("CSdbConnectionString")
        { }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<sched>()
            .HasRequired(b => b.faculty)
            .WithMany(b => b.schedentries)
            .WillCascadeOnDelete(true);           
        }

    public DbSet<appointment> appointments { get; set; }
        public DbSet<faculty> faculties { get; set; }
        public DbSet<sched> scheds { get; set; }
        public DbSet<student> students { get; set; }

    }

总而言之,我想要发生的是删除教师类中的数据,同时删除它是sched类中的数据。

我已经研究过,之前我曾经问过这个叫做级联的问题,我在这里找到了一个解决方案,这就是我复制的内容。

此外,这一行:

  

fac.schedentries.Remove(附表);

应该是

  

db.schedentries.Remove(附表);

但我无法使用db访问schedentries。我不知道这是否与错误有关。

有人能帮助我吗?请赐教,不要粗暴对我说。我是MVC的新手,所有的帮助将不胜感激。谢谢你,祝你有个愉快的一天。

3 个答案:

答案 0 :(得分:1)

您要删除枚举集合的foreach循环内的集合中的项目。要解决您的问题,您需要修改代码:

var itemsToRemove = fac.schedentries.ToList();
foreach (var sched in itemsToRemove)
{
    fac.schedentries.Remove(sched);
}

而不是在枚举时修改fac.schedentries集合,而是创建一个随后枚举的副本。

当你使用foreach循环时,你有一个枚举器(sched变量),这个枚举器必须跟踪集合中的当前位置(它保持链接回到集合正在列举)。如果修改了集合,则枚举器不再能够跟踪此位置并抛出异常来发出信号。

答案 1 :(得分:1)

只需更改

foreach (var sched in fac.schedentries)
{
    fac.schedentries.Remove(sched);
}

foreach (var sched in fac.schedentries.ToList())
{
    fac.schedentries.Remove(sched);
}

ToList()将为您提供一个新集合,因此fac.schedentries.Remove(sched);将不会修改正在迭代的集合

答案 2 :(得分:0)

在枚举过程中,您无法从枚举中删除项目。所以这段代码不起作用。

   foreach (var sched in fac.schedentries)
   {
        fac.schedentries.Remove(sched);
   }

替换为

  fac.schedentries.RemoveAll(s => s != null);