在执行MarkAsDeleted() 之前,对子实体进行统一删除,以避免VirtualEntityDeleted中出现外键约束错误
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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。