与子记录一起删除记录

Posted

技术标签:

【中文标题】与子记录一起删除记录【英文标题】:Deleting record along with child records 【发布时间】:2016-04-07 17:23:37 【问题描述】:

我有一个提交控制器,它与其他几个表具有一对多的关系。下面是我的模型:

public partial class Submission

    public Submission()
    
        this.WorkorderLogs = new HashSet<WorkorderLog>();
    

    public int Id  get; set; 
    public int WorkOrderId  get; set; 
    public int PartStagingId  get; set; 
    public System.DateTime SubmissionDate  get; set; 

    public virtual PartStaging PartStaging  get; set; 
    public virtual WorkOrder WorkOrder  get; set; 
    public virtual ICollection<WorkorderLog> WorkorderLogs  get; set; 

我希望应用程序在我删除提交记录时删除所有子记录。下面是我的删除方法:

[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(int id)

    Submission submission = db.Submissions.Find(id);

    foreach (var w in submission.WorkorderLogs)
    
        submission.WorkorderLogs.Remove(w);
    

    db.Submissions.Remove(submission);
    db.SaveChanges();

    return RedirectToAction("Index");

这在 foreach 循环的第一次迭代后给了我一个错误。以下是我得到的错误:

Exception Details: System.InvalidOperationException: Collection was modified; enumeration operation may not execute.

在这种情况下如何删除子记录?

【问题讨论】:

见here。您还可以配置级联删除,而不是先删除所有子项。请参阅here、here 和 ... 这与子相关记录无关。如果你不使用EF,你会遇到同样的问题。您在迭代集合时正在修改它。这是不允许的。您需要使用 for 循环并向后从集合中删除项目,或者如果可能的话,只需从集合中执行 RemoveAll! 【参考方案1】:

我没有启用 On Delete Cascade,但我修改了 foreach 循环并且它可以工作

foreach (var w in db.WorkorderLogs.Where(x => x.SubmissionId == submission.Id))

    db.WorkorderLogs.Remove(w);

【讨论】:

以上是关于与子记录一起删除记录的主要内容,如果未能解决你的问题,请参考以下文章

SQL Join与子查询计算不同表中具有相同ID的记录数

记录gorm union和软删除一起使用遇到的一个奇怪问题

记录gorm union和软删除一起使用遇到的一个奇怪问题

如何查看浏览器已删除的记录

从 SwiftUI 列表和领域中删除记录时出错

sql删除重复记录