在执行MarkAsDeleted() 之前,对子实体进行统一删除,以避免VirtualEntityDeleted中出现外键约束错误

编程语言 2026-07-09
public void VirtualEntityDeleted(object sender, VirtualEntityChangedEventArgs e)
{
    if ((_DocumentEntity.ID > 0 && _AddedRows != null && _AddedRows.Any(a => a.Key == e.VirtualEntityGuid))
            || (_DocumentEntity.ID == 0 && _DocumentEntity.VirtualData.Tables.Contains(CustomEntity1) && _DocumentEntity.VirtualData.Tables[CustomEntity1].Rows.Count > 0)
            )
    {
        if (_DeletedRows == null)
            _DeletedRows = new Dictionary<Guid, long>();

        var row = _DocumentEntity.VirtualData.Tables[CustomEntity1].Select("GUID = '" + e.VirtualEntityGuid + "'").FirstOrDefault();

        if (row == null) 
                    return;

        if (_DocumentEntity.VirtualData.Tables[CustomEntity1].Columns.Contains("LineGuid"))
        {
            var _line = _DocumentEntity.Lines.Where(r => Convert.ToString(r.Guid) == Convert.ToString(row["LineGuid"])).FirstOrDefault();

            if (_line != null)
                _line.MarkAsDeleted();
        }
        else
        {
            var _row = _DocumentEntity.Lines.Where(r => Convert.ToString(r.ID) == Convert.ToString(row["TransactionLIneID"])).FirstOrDefault();

            if (_row != null)
                _row.MarkAsDeleted();
        }

        _DeletedRows.Add(e.VirtualEntityGuid, row["ID"] != DBNull.Value ? Convert.ToInt64(row["ID"]) : 0);
    }
}

我在一个C#应用程序中有一个 VirtualEntityDeleted() 事件。当一个虚拟行被删除时,它调用 line.MarkAsDeleted(),并且相应的物理行已成功删除。

问题在于物理行具有子关系记录(外键引用),但这些子记录没有被自动删除。在保存时,SQL会抛出外键约束错误。

我想要一个通用的解决方案(不对表名如 PurchasePostingRelation 或外键列名进行硬编码),在删除父实体之前删除依赖的子实体。

当前错误:

DELETE语句与引用约束冲突。
冲突发生在表 'PurchasePostingRelation'。

如何在调用 MarkAsDeleted() 之前,通用地检测并删除子实体?

解决方案

问题在于物理行具有子关系记录(外键引用),但这些子记录没有被自动删除。在保存时,SQL会抛出外键约束错误。

我建议你考虑实体框架的级联删除是否能帮助你解决问题。请参考以下微软文档了解详细信息:

级联删除

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章