2011-04-16 58 views
0

我爲兩個實體定義了一對多關係,我們只需說Customer和Order。該關係指出一個Customer對象可以有許多Order對象,但是一個Order必須有一個Customer ...一個非常標準的1:M關係。爲什麼在刪除一些實體實例時拋出InvalidOperationException異常,而爲別人拋出UpdateException

我沒有在數據庫上配置級聯規則,而OnDeletes在我的實體數據模型中設置爲None。這意味着刪除有訂單的客戶將不被允許。

我的問題是,當我的應用程序的用戶刪除的客戶(可能有訂單),我要趕由強制執行外鍵約束拋出的異常。對於有33個訂單的特定客戶,我得到InvalidOperationException,但對於只有2個訂單的另一個客戶,我得到UpdateException。 EF正在讓第二條刪除語句進入數據庫,並且數據庫正在返回EF爲其生成UpdateException的錯誤。在第一種情況下,EF甚至沒有讓delete語句訪問數據庫,它只是說,這將是無效的,因爲客戶的這種實體實例包含訂單。

任何人都可以解釋爲什麼會發生這種行爲?

回答

2

可以有兩個不同的異常,因爲存在其中施加該檢查兩層。首先,如果你標記一個對象被刪除並執行SaveChanges EF將檢查所有加載的對象跟蹤其內部存儲。如果EF發現相關刪除客戶的任何跟蹤訂單還沒有被標記爲刪除的時候,就會觸發一個異常(可能InvalidOperationException)。如果沒有跟蹤的相關訂單,EF將在FK關係觸發錯誤的數據庫中執行刪除操作。這個錯誤被EF捕獲,並且一個異常是throwm(可能是UpdateException與內部數據庫相關的異常)。

相關問題