2010-02-24 98 views
14

當我嘗試更改外鍵時正在生成此錯誤。 我知道這是一個非常常見的錯誤,我發現了大量的關於它的信息並試圖實現我找到的修復程序,但在嘗試更新密鑰時仍然出現此錯誤。 Reference ThreadLINQ to SQL ForeignKeyReferenceAlreadyHasValueException錯誤

本來我只是直接分配值而不是試圖映射實體。

ticket.assigned_to_group = assigned_to 

我已經改變了嘗試和映射的實體,我相信正確的答案;但是我仍然得到錯誤。

ticket.assigned_to_group = db.sub_units.Single(f => f.id == assigned_to).id; 

任何想法爲什麼這不起作用。另外,如果我有一個包含多個外鍵的表,我是否真的需要爲每個鍵做一個新的查詢,還是有更好的方法?

回答

34

我想你需要分配實體時要分配一個ID。 (我不是100%肯定這是你在做什麼)

// Don't assign just the id 
Person.ParentId = parentId; 

// Assign the entity 
Person.Parent = db.Parents.Single(x.Id == parentId); 
+0

啊你是對的我還在試圖給ID分配一個新的值而不是分配實體。 This now works: t.sub_unit = db.sub_units.Single(f => f.id == assigned_to) – Tim

+0

這個(在我的情況下)只是一個問題,當Id不可爲空時,通過僅分配更新可空的ID一個新的ID工作正常。爲什麼會這樣? – CRice

+0

你不要指定ParentId。唯一需要的任務是實體。 –

0

關於第二個問題,你可以通過

var groups = db.sub_units.ToArray(),一旦加載在內存中的所有sub_units做這樣的事情:

foreach(var ticket in tickets) 
{ 
    ticket.assigned_to_group = groups.Single(f => f.id == assigned_to); 
} 
+0

這不是什麼我知道。 票類除了'sub_units'/ assigned_to_group table.key之外還有其他幾個表的FK。 ticket.priority1 = db.priorities.Single(p => p.id == priority_id); ticket.sub_unit = db.sub_units.Single(f => f.id == assigned_to); 或者我需要爲每個相關表格做這件事。 – Tim