簡體   English   中英

從相關的多個 EF 表中刪除記錄

[英]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 中。 還有其他方法可以將項目添加到更改跟蹤器,但這些超出了本問題的范圍。

因此,您需要做的就是在刪除之前獲取要刪除的所有項目。

解決方案

所以你有EmployeesEmployeeTasks 顯然, EmployeesEmployeeTasks之間存在一對多關系:每個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM