2014-03-26 14 views
0

操作失敗:關係無法更改,因爲一個或多個外鍵屬性不可空。當對關係進行更改時,相關的外鍵屬性將設置爲空值。如果外鍵不支持空值,則必須定義新的關係,必須爲外鍵屬性指定另一個非空值,或者必須刪除不相關的對象。實體框架:添加子對象時,因爲一個或多個外鍵屬性不可空,所以關係無法更改

我知道這個問題在這裏已經被問過幾次了,常見的答案似乎是,當舊的子對象在被修改或從父對象中刪除時沒有被正確刪除時出現這個錯誤。然而,我試圖做這些事情都沒有,我仍然得到錯誤。

我的系統的工作原理大致是這樣的:

我有一個鉛筆廠,這使得許多不同品種的鉛筆,這些都是成套銷售。這些套裝進來的鉛筆盒也是由我製造的。每個單獨的鉛筆都可以唯一標識,情況也一樣。鉛筆不能獨立於他們的案件出售或擁有,但是如果新鉛筆被設計並添加到現有案例中,我們會將這些鉛筆中的一個發送給已經購買了該特定案例的每個客戶。

因此,我們有五個表在這裏:

  • 筆盒
    • ID
    • 風格
  • 鉛筆
    • ID
    • 顏色
    • 筆盒
  • CustomerPencilCase
    • SERIALNUMBER
    • 筆盒
    • 客戶
  • CustomerPencil
    • SERIALNUMBER
    • 鉛筆
    • customerPencilCase
  • 客戶
    • ID

下面是用於創建一個新的CustomerPencil,生成一個唯一的序列號它,並添加功能它到數據庫。 'db.SaveChanges()'在這裏被調用以降低碰撞風險。

Private Function CreateNewCustomerPencil(pencil As Pencil, customerPencilCase As CustomerPencilCase) As CustomerPencil 
    Dim customerPencil As New CustomerPencil 
    Dim serialNumber As String 

    Dim isUnique As Boolean = False 
    While isUnique = False 
     serialNumber = GenerateSerialNumber() 
     If (From cp In db.CustomerPencils Where cp.serialNumber = serialNumber).Count < 1 Then 
      isUnique = True 
      customerPencil.serialNumber = serialNumber 
      customerPencil.pencil = pencil 
      customerPencilCase.customerPencils.Add(customerPencil) 
      db.SaveChanges() 
     End If 
    End While 

    Return customerPencil 
End Function 

所以,如上所述,有兩種情況調用該函數。首先是將新鉛筆添加到PencilCase中。在這種情況下,與新鉛筆關聯的CustomerPencil被添加到與PencilCase相對應的每個CustomerPencilCase中。 該子程序與上述功能完美配合使用。

Private Sub AssignPencilToPencilCase(pencil As Pencil, pencilCase As PencilCase) 
    Dim customerPencilCaseQuery = From cpc In db.CustomerPencilCases Where cpc.pencilCase.id = pencilCase.id Select cpc 
    Dim customerPencilCases As List(Of CustomerPencilCase) = customerPencilCaseQuery.ToList 

    For Each customerPencilCase As CustomerPencilCase In customerPencilCases 
     Dim customerPencil = CreateNewCustomerPencil(pencil, customerPencilCase) 
    Next 
End Sub 

另一種情況是客戶購買新的CustomerPencilCase。在這種情況下,對於存在於相應PencilCase中的每個鉛筆,必須創建一個新的CustomerPencil。 這是有問題的子程序,在上述函數中調用db.SaveChanges()時會失敗。

Private Sub AssignPencilCaseToCustomer(pencilCase As PencilCase, customerPencilCase As CustomerPencilCase) 
    Dim pencils = GetPencils(pencilCase.id) 

    For Each pencil As Pencil In pencils 
     Dim customerPencil = CreateNewCustomerPencil(pencilCase, customerPencilCase) 
    Next 
End Sub 

我一直停留在這個問題上的天數,現在,將是有史以來如此感激,如果任何人都可以提出什麼我可能是做錯了。

+1

你可以展示一個例子'鉛筆'對象你傳遞到'CreateNewCustomerPencil'函數? EF有能力將外鍵包含在它爲實體生成的類中。你確定這個正在填充嗎?如果您將其設置爲「0」,則可能會破壞關係。 – Justin

回答

0

Phew,設法解決它。非常感謝賈斯汀,您的評論讓我朝着正確的方向發展。

在這種情況下,問題出在我發送給CreateNewCustomerPencil函數的Pencil對象上。最初傳遞給AssignPencilToPencilCase的那個數據先前從數據庫中直接檢索到,因此工作正常。但是,在破壞的子程序中由GetPencils檢索到的那些在檢索後實際上稍微改變了。這導致EF認爲我修改了這些鉛筆,這意味着數據庫中現有的鉛筆成爲孤立的,導致不可空的外鍵錯誤。

相關問題