2012-10-31 43 views
1

我看到了有關此主題的答案,但不完全如我的。DELETE語句與參考約束「FK_EntityAEntityB」衝突

我在設計器中使用EF1創建了一個數據庫模式。 我增加了關係一個或零到多在兩個表之間(實體A實體B)。 接下來,我向表EntityA添加了一條記錄,並向EntityB記錄中添加了一條記錄到EntityB。 正如我在設計模式(在MS SMS中)看到字段EntityA_id(在表EntityB中)設置爲允許NULL, 我試圖刪除表EntityA中的記錄。

我預計該記錄將被刪除,表EntityB中的字段EntityA_id將被自動設置爲NULL。 不幸的是我得到異常:DELETE語句衝突與基準約束「FK_EntityAEntityB」如果與外鍵字段設置爲允許空

爲什麼例外拋出?

回答

-1

您必須自己刪除關聯,方法是設置EntityB.EntityA = nullEntityA.EntityBs.Clear()

當父記錄被刪除時,您可能會認爲EF應該能夠使外鍵值本身無效。它可能會,因爲它具有所有必需的信息。但我懷疑這是否可取。在沒有意識到的情況下創造孤兒是一個敞開的大門。讓我感到毛骨悚然。除此之外,遍歷每個刪除的外鍵關聯在性能方面並不是很有趣。

+0

感謝您的回答。 NULL分配的作品,但我不得不手動找到許多記錄中的EntityB。使用CLEAR方法似乎不合適,因爲它清除了所有記錄EntityB和EntityA之間的關係。我檢查了CLEAR,它不起作用。數據庫中沒有例外,也沒有影響。 通過ORM自動刪除比手動分配NULL更安全。也許在EF中有一些配置可以生成合適的SQL過程或觸發器。 – Bronek

+0

「,因爲它清除了所有記錄EntityB和EntityA之間的關係」。但是,這不是說如果你想刪除A會發生什麼? –

+0

是的,你是對的。 CLEAR方法更好,因爲保證沒有孤兒。但它不起作用,因爲在我的應用程序中,集合總是空的。我不知道爲什麼。 – Bronek

0

爲什麼如果將帶有外鍵的字段設置爲ALLOW NULL,則拋出異常?

異常被拋出的理由是,你想做什麼影響整行,不只是空列。設置子表中的列允許null規定該列允許沒有值。除非RDBMS明確規定,否則可空列與外鍵等參照完整性約束無關;這意味着無論設置了哪些專門的特定規則,外鍵規則仍將啓動。而外鍵規則規定,如果子表中有子項,則不能刪除父行。這樣做會使所有的兒童孤兒成爲孤兒。我們現在不想讓任何人成爲孤兒嗎?

什麼是外鍵保證你是沒有值將被插入/刪除在外鍵列中,在子表中沒有引用父表的鍵列中的有效值,如下所示:相反,沒有父行可以(除非已指定ON DELETE子句),如果相關表中有任何子行。

rules of null foreign key columns in MSSQL(我假設你正在使用)聲明外鍵列允許包含空值。這就是你可能需要做的,以避免這種情況。將列值設置爲NULL,然後嘗試刪除。

無關的這一點,你可能會感興趣的this

相關問題