操作失敗:關係無法更改,因爲一個或多個外鍵屬性不可空。當對關係進行更改時,相關的外鍵屬性將設置爲空值。如果外鍵不支持空值,則必須定義新的關係,必須爲外鍵屬性指定另一個非空值,或者必須刪除不相關的對象。實體框架:添加子對象時,因爲一個或多個外鍵屬性不可空,所以關係無法更改
我知道這個問題在這裏已經被問過幾次了,常見的答案似乎是,當舊的子對象在被修改或從父對象中刪除時沒有被正確刪除時出現這個錯誤。然而,我試圖做這些事情都沒有,我仍然得到錯誤。
我的系統的工作原理大致是這樣的:
我有一個鉛筆廠,這使得許多不同品種的鉛筆,這些都是成套銷售。這些套裝進來的鉛筆盒也是由我製造的。每個單獨的鉛筆都可以唯一標識,情況也一樣。鉛筆不能獨立於他們的案件出售或擁有,但是如果新鉛筆被設計並添加到現有案例中,我們會將這些鉛筆中的一個發送給已經購買了該特定案例的每個客戶。
因此,我們有五個表在這裏:
- 筆盒
- 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
我一直停留在這個問題上的天數,現在,將是有史以來如此感激,如果任何人都可以提出什麼我可能是做錯了。
你可以展示一個例子'鉛筆'對象你傳遞到'CreateNewCustomerPencil'函數? EF有能力將外鍵包含在它爲實體生成的類中。你確定這個正在填充嗎?如果您將其設置爲「0」,則可能會破壞關係。 – Justin