如何解决从相关的多个EF表中删除记录
我尝试处理级联删除,手动删除关联实体集中的所有相关实体
try
{
using (var context = new Model1())
{
var deleteEmp =
(from ed in context.EmployeeDept where ed.ID == edid select ed).FirstOrDefault();
foreach (EmployeeTask empTask in deleteEmp.EmployeeTasks)
{
context.EmployeeTasks.Remove(empTask);
}
context.EmployeeDepts.Remove(deleteEmp);
context.SaveChanges();
}
}
catch (Exception ex)
{
throw new Exception("Existing employee could not be deleted " + ex.ToString());
}
其中 edid 是可变的。 当我通过单击F10进行调试时,所有执行均正确,直到该行: context.EmployeeTasks.Remove(empTask); 执行后,光标返回到 in 。 之后,我收到错误消息: “ System.Exception:无法删除现有雇员System.InvalidOperationException:集合已修改;枚举操作可能无法执行。” 怎么了如何解决? 谢谢。
解决方法
在.ToList()
之后添加deleteEmp.EmployeeTasks
foreach (EmployeeTask empTask in deleteEmp.EmployeeTasks.ToList())
{
context.EmployeeTasks.Remove(empTask);
}
,
您可以这样尝试,但是将i.parentId
替换为真实的导航属性
try
{
using (var context = new Model1())
{
var deleteEmp = context.EmployeeDept.FirstOrDefault(i => i.id == deletedEmpId);
var childEmps = context.EmployeeDept.Where(i => i.parentId == deletedEmpId).ToList();
context.EmployeeDepts.RemoveRange(childEmps);
context.EmployeeDepts.Remove(deleteEmp);
context.SaveChanges();
}
}
catch (Exception ex)
{
throw new Exception("Existing employee could not be deleted " + ex.ToString());
}
,
问题原因
在Entity Framework中,您只能Remove
中的DbContext.ChangeTracker
个项目。 ChangeTracker中的每个项目都有一个状态,说明是否已添加/修改/删除。
调用SaveChanges时,将检查ChangeTracker以查看哪些项目必须更新。
每当您获取完整的项目时,因此无需使用Select
,该项目就会自动存储在ChangeTracker中。还有其他将项目添加到变更跟踪器的方法,但是这些方法不在此问题的范围内。
因此,您所需要做的就是在删除所有要删除的项目之前。
解决方案
因此,您有Employees
和EmployeeTasks
。显然,Employees
和EmployeeTasks
之间存在一对多的关系:每个Employee
都有零个或多个EmployeeTasks
;每个EmployeeTask
都完全属于一个Employee
,即外键Employee
所引用的EmployeeId
。
您需要获取Employee和所有EmployeeTask,删除所有任务,然后删除Employee:
int employeeToRemoveId = ...
using (var dbContext = new EmployeeDbContext(...))
{
var employee = dbContext.Employees.Find(employeeToRemoveId);
if (employee != null)
{
// there is an employee with this Id. get its tasks:
var tasksOfThisEmployee = dbContext.EmployeeTasks
.Where(task=> task.EmployeeId == employeeToRemoveId)
.ToList();
// remove the tasks; remove the employee; save the changes
dbContext.EmployeeTasks.RemoveRange(tasksOfThisEmployee);
dbContext.Employees.Remove(employee);
dbContext.SaveChanges();
}
// else: there is no Employee with this Id; nothing to do.
}
简单的漫画卓悦!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。