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();