关于EDM模型中多个实体之间循环引用导致保存数据失败的解决方案一例

由于分判商工程款及业主收入之明细都与标书清单之间有外键关联,EDM模型中会自动建立以下关系:
SPaymentDetail <---> BillQuantity    外键:FK_SPaymentDetail_BillQuantity
ProjectIncomeDetail <---> BillQuantity    外键:FK_ProjectIncomeDetail_BillQuantity
同时会在SPaymentDetail、ProjectIncomeDetail表各添加一个关联到BillQuantity的导航属性,在BillQuantity表添加两个导航属性分别关联到前面两个表。

这一切本身是没问题的,但遇到如下情况就会出现问题:
用户添加了一行粮单明细并选择了对应的标书,同时在粮单明细编辑界面中修改了标书数量、单价等信息,那么此时明细的状态是新增,标书清单的状态是修改
当提交到数据库保存时,首先保存明细到数据库,由于粮单明细关联的标书清单状态为修改状态,会触发保存标书清单到数据库,在完成这一步之后由于标书清单
关联的粮单明细是新增状态,又会触发保存粮单明细到数据库,而这时候就会发生主键重复的异常了。
归根结底,发生错误的原因是当遇到上述情况时两个实体之间反复循环引用对方,导致提交到数据库时同一数据多次保存。

最后,分析完原因之后,要找到解决方案就很容易了,删除一方的导航属性即可。在此案例中,由BillQuantity实体导航到粮单明细的意义并不大,所以删除该实体的两个导航属性即可。

原文地址:https://www.cnblogs.com/wiseant/p/2320690.html