C# 删除具有一对多关系的实体

C# 删除具有一对多关系的实体,c#,entity-framework,ef-code-first,C#,Entity Framework,Ef Code First,学校模式 public class School { public int SchoolId { get; set; } public string Name { get; set; } public string FullName { get; set; } public virtual ICollection<User> Users { set; get; } } 存储库: public virtual void Delete(T entity

学校模式

public class School
{
    public int SchoolId { get; set; }
    public string Name { get; set; }
    public string FullName { get; set; }
    public virtual ICollection<User> Users { set; get; }
}
存储库:

 public virtual void Delete(T entityToDelete)
 {
     if (context.Entry(entityToDelete).State == System.Data.Entity.EntityState.Detached)
     {
          dbSet.Attach(entityToDelete);
     }
     dbSet.Remove(entityToDelete);
 }
和控制器

 public ActionResult _Delete(int? id)
 {
     if(id == null)
     {
         return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
     }

     School school = RepositoryFactory.Create<ISchoolRepository>().Find(id);
     if(school == null)
     {
          return HttpNotFound();
     }
     return PartialView(school);
   }

   [HttpPost, ActionName("SchoolDelete")]
   [ValidateAntiForgeryToken]
   public ActionResult DeleteConfirmed(int id)
   {
       School school = RepositoryFactory.Create<ISchoolRepository>().Find(id);
       RepositoryFactory.Create<ISchoolRepository>().Delete(school);
       RepositoryFactory.Create<ISchoolRepository>().SaveChanges();
       return RedirectToAction("Index");
    }
但当我尝试删除有用户连接的学校时,我得到一个ex:

EntityFramework.dll中出现“System.Data.Entity.Infrastructure.DbUpdateException”类型的异常,但未在用户代码中处理 其他信息:更新条目时出错。有关详细信息,请参见内部异常

所以我尝试在每个用户学校设置null:

School school = RepositoryFactory.Create<ISchoolRepository>().Find(id);
foreach (var item in school.Users)
{
     var user = RepositoryFactory.Create<IUserRepository>().Find(item.Id);
     user.School = null;
     RepositoryFactory.Create<IUserRepository>().Update(user);
     RepositoryFactory.Create<IUserRepository>().SaveChanges();
}
RepositoryFactory.Create<ISchoolRepository>().Delete(school);
RepositoryFactory.Create<ISchoolRepository>().SaveChanges();
但由于这一点,我得到:

System.Core.dll中发生“System.InvalidOperationException”类型的异常,但未在用户代码中处理

附加信息:集合已修改;枚举操作可能无法执行


当我没有学生参加ICollection时,它工作得非常好。

像这样试试。我认为应该行得通

var school = RepositoryFactory.Create<ISchoolRepository>().Find(id);
var userRepository = RepositoryFactory.Create<IUserRepository>();

for (var i = school.Users.Count - 1; i >= 0; i--)
{
     userRepository.Delete(school.Users[i]);
}
RepositoryFactory.Create<ISchoolRepository>().Delete(school);
RepositoryFactory.Create<ISchoolRepository>().SaveChanges();

有关详细信息,请参见内部异常。内部异常说明了什么?请尝试使用for循环向后迭代并从UserRepository中删除。我无法将for循环与此ICollection一起使用,我遇到了错误:无法将带[]的索引应用于类型为“System.Collections.Generic.ICollection”的表达式无法将索引应用于[]对于“System.Collections.Generic.ICollection”类型的表达式,这样做没有帮助。
var school = RepositoryFactory.Create<ISchoolRepository>().Find(id);
var userRepository = RepositoryFactory.Create<IUserRepository>();

for (var i = school.Users.Count - 1; i >= 0; i--)
{
     userRepository.Delete(school.Users[i]);
}
RepositoryFactory.Create<ISchoolRepository>().Delete(school);
RepositoryFactory.Create<ISchoolRepository>().SaveChanges();