你之所以面臨這種情況是因為構圖和聚集.
在組合中,創(chuàng)建父對象時創(chuàng)建子對象,在其父對象銷毀時銷毀子對象。..所以它的壽命是由它的父母控制的。博客文章及其評論。如果刪除某一帖子,則應刪除其評論。對一個不存在的帖子有評論是沒有意義的。訂單和訂單項目相同。
在聚合中,子對象可以存在,而不考慮其父對象。..如果父對象被銷毀,子對象仍然可以存在,因為以后可能會添加到其他父對象中。播放列表中的歌曲與播放列表中的歌曲之間的關系。如果播放列表被刪除,則不應刪除歌曲。它們可以添加到不同的播放列表中。
實體框架區(qū)分聚合和組合關系的方式如下:
因此,出現(xiàn)此問題的原因是您如何在子表中設置主鍵。它應該是合成的,但它不是。因此,實體框架將這種關聯(lián)視為聚合,這意味著,當您刪除或清除子對象時,它不會刪除子記錄。它只需刪除關聯(lián)并將相應的外鍵列設置為NULL(因此這些子記錄以后可以與不同的父記錄關聯(lián))。由于您的列不允許NULL,所以會得到您提到的異常。
解決辦法:
1-如果您有強烈的理由不想使用復合鍵,則需要顯式地刪除子對象。這可以比前面提出的解決方案更簡單:
context.Children.RemoveRange(parent.Children);
2-否則,通過在子表上設置正確的主鍵,您的代碼將看起來更有意義:
parent.Children.Clear();