[英]delete records from related multiple EF tables
我嘗試處理級聯刪除手動刪除關聯實體集中的所有相關實體
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:集合已修改;枚舉操作可能無法執行。” 什么是問題? 如何解決? 謝謝。
在deleteEmp.EmployeeTasks
之后添加.ToList()
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());
}
在實體框架中,您只能Remove
DbContext.ChangeTracker
中的DbContext.ChangeTracker
。 ChangeTracker 中的每個項目都有一個狀態,說明它是否已添加/修改/刪除。
當您調用 SaveChanges 時,會檢查 ChangeTracker 以查看必須更新哪些項目。
每當您獲取完整的項目時,因此無需使用Select
,該項目將自動存儲在 ChangeTracker 中。 還有其他方法可以將項目添加到更改跟蹤器,但這些超出了本問題的范圍。
因此,您需要做的就是在刪除之前獲取要刪除的所有項目。
所以你有Employees
和EmployeeTasks
。 顯然, Employees
和EmployeeTasks
之間存在一對多關系:每個Employee
有零個或多個EmployeeTasks
; 每EmployeeTask
屬於一個Employee
,即Employee
外鍵EmployeeId
指。
您需要獲取 Employee 和所有 EmployeeTasks,刪除所有任務,然后刪除 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.
}
簡單的來吧!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.