我有一个对象Tag
,它链接到一大堆其他对象。我正在尝试处理此对象的删除。如果它与任何其他对象相关联,我根本不想删除它。
目前我正在解决这个问题:
if(tag.Stands.Count == 0 && tag.Skids.Count == 0
&& tag.Panels.Count == 0 && tag.Devices.Count == 0
&& tag.Cables.Count == 0 && tag.JunctionBoxes.Count == 0)
{
_db.Tags.DeleteObject(tag);
_db.SaveChanges();
}
如果我没有检查所有这些事情,我显然会得到一个参考约束错误,例如
System.Data.SqlClient.SqlException:DELETE语句发生冲突 使用REFERENCE约束“FKStandTag237968”。
我知道解决这个问题的方法是使用级联删除,但实际的业务逻辑是,如果标记与任何其他对象相关联,则不应删除标记。
有没有办法使用实体框架我可以检查在尝试保存删除之前我不会破坏数据库的任何约束?有些事情_db.IsValidToDelete(object)
?
答案 0 :(得分:2)
拥有这样的方法(_db.IsValidToDelete(object)
)并不能保证您删除它是安全的。您的应用程序是一个多用户应用程序。因此,当另一个用户尝试删除标记时,一个用户可以关联标记。
更好的替代方法是允许用户删除标记并捕获异常以检查它是否是参照完整性违规。
答案 1 :(得分:2)
顺便说一下。每个调用如tag.Stands.Count
都会将数据库中所有相关的Stands
加载到您的应用程序中,因此如果您有很多关系,并且每个关系都包含很多实体,那么此验证将非常昂贵且速度慢。
您可以使用@ Eranga的建议并捕获异常或创建存储过程以删除标记。