2014-12-09 95 views
0

使用EF6,我在SQL數據庫中有兩個表,並且我首先使用數據庫從數據庫創建EF圖。未強制實體框架參照完整性

我的數據庫缺少一個表的PK和另一個表中的外鍵之間的外鍵約束。

與其將外鍵約束添加到數據庫中,我將其創建爲EF模型中的關聯。

該關聯在EF模型中看起來不錯,它具有正確的主體和從屬關係。

但是,如果我在存在依賴項時從主體表中刪除了一行,那麼參照完整性將無法啓動,並且主要行將被刪除。

我知道我只需將關係添加到SQL數據庫並從數據庫更新模型即可。但我想了解EF的功能範圍,以及是否應該可以在EF模型中添加關係,而不是在SQL數據庫中添加關係,並且它仍然可以工作?

在我看來,如果聯繫(關係)存在於EF而不是MSSQL中,那麼當您通過EF刪除一行時,關聯在參照完整性時將被忽略?

+0

你想要的功能已經與EF一起存在,你只是想正確使用它,如果你想刪除父母並強制刪除它的所有依賴者,你需要將級聯刪除設置爲true。查看你的遷移文件是什麼設置的。同時,刪除父母時,你可能還需要加載它的所有孩子。 – 2014-12-10 03:32:24

+0

謝謝。我不想查找級聯刪除,我想要在嘗試刪除具有相關依存關係行的主體行時引發參照完整性異常。正如我在問題中所說的那樣,我可以將關係添加到數據庫模式中,但我想了解EF在參照完整性方面如何處理關聯。看起來,如果EF沒有在數據庫模式中存在對應關係,那麼EF允許您創建一個關於參照完整性無關的關聯? – 2014-12-10 10:33:11

回答

0

但是,如果從屬表存在依賴關係時從主表中刪除了一行,那麼參照完整性將無法啓動,主要行將被刪除。

依賴者存在於數據庫中,或存在於上下文中嗎?

如果您尚未在上下文中加載所有依賴實體,EF將無法刪除它們。它需要用於刪除語句的鍵。如果不在上下文中,它甚至不知道它們存在。

因此,參照完整性工作的唯一方法是如果EF檢索所有相關實體到上下文中,刪除主體實體,因此它可以爲它們中的每一個發出刪除語句(即使有成千上萬)。我認爲,如果在上下文中存在依賴實體,那麼無論如何EF都會發出刪除語句(即使它期望db完成所有工作)。

希望它有幫助。

+0

謝謝。依賴者存在於數據庫中,我不會將依賴者加載到上下文中,因爲它使用的是OData客戶端,並且不希望通過線路傳遞其他數據。我只研究爲什麼引用完整性不起作用(我不想級聯刪除,當我嘗試刪除具有相關行的主體行時,我想要引用完整性異常)。從你所說的話來看,聽起來好像在EF中創建的關聯不會固有地強制參照完整性,如果底層數據庫方案不具有相同的關係。 – 2014-12-10 10:30:07

+0

不,它只會強制加載實體的參照完整性,沒有別的。 – 2014-12-10 10:32:59