我正在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的新手,所有的帮助将不胜感激。谢谢你,祝你有个愉快的一天。
答案 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);