2010-09-27 65 views
0

這是一個棘手的問題...所以忍受着我。MS SQL Server 2008檢查約束和LINQ到SQL

我在我的數據庫中有兩個表,[Item][AssignedProperty][AssignedProperty]是與[Item]有親子關係的孩子。所以它基本上只有一個ItemID字段和一個使用它的外鍵關係。 [AssignedProperty]也與另一個名爲[Property]的表以及它自己的主鍵AssignedPropertyID具有相同的關係。這創造了一個很好的多對多關係。然而,我有一個限制,即規定一個[AssignedProperty]不能在同一條記錄中出現ItemID和PropertyID的重複。因此[Item]只能有一個[Property]

這很好用,但對於LINQ-to-SQL,我認爲這是一個與我們的約束衝突的執行順序問題。

爲了產生此錯誤,我在我的應用程序中使用LINQ-To-SQL加載[Item]。然後我從項目的[AssignedProperties]集合中選擇一個[AssignedProperty]]對象並將其刪除。然後,我創建一個新的[AssignedProperty]對象,它具有與剛剛刪除的ItemID和PropertyID完全相同的ItemID和PropertyID,並將其添加回集合中。當我在DataContext上調用[SubmitChanges]時,它會在約束上標記我。如果舊的[AssignedProperty]記錄首先被刪除,那麼沒有理由爲什麼新的記錄會產生該錯誤。它看起來像是在刪除舊的之前試圖插入新的[AssignedProperty]

我該如何解決這個問題,並在數據庫或我的應用程序? TIA

+0

ItemID,PropertyID是您的AssignedProperty表中的主鍵嗎?是的,你能解釋爲什麼你刪除並重新插入完全相同的記錄?但修復很簡單:只要提交更改兩次,刪除後和重新插入後 – Francisco 2010-09-27 17:27:54

+0

啊,如果我不得不忘記的東西就是這樣,哈哈。 AssignedProperty有它自己的主鍵,AssignedPropertyID,autoincrement。就項目而言,用戶可以隨意對項目實體進行多項更改,並隨時保存或拒絕更改。因此,應用程序嘗試處理這種情況的方式是,所有更改都可以同時提交。理想情況下,用戶可能不會刪除AssignedProperty並再次完全相同。但它可能。 – instantmusic 2010-09-27 17:37:36

+0

我認爲可以完成的唯一方法是,您的應用程序會檢測AssignedProperty何時被刪除然後重新插入,因此它不會首先將其刪除。我不認爲從數據庫中刪除約束是個好主意,因爲數據遲早會被損壞。我不知道任何方式可以預測linq2sql處理所有事務的方式,或者強制執行命令,因此這也可能是一種非常困難的方法。 – Francisco 2010-09-27 20:19:36

回答

0

94%的人在嘲笑我,而答案實際上是在原帖的評論中。

所以,這只是讓我可以選擇一個答案。