2010-01-11 54 views
8

我有這個奇怪的錯誤Cannot add an entity with a key that is already in use 但是,有什麼是相當煩躁的錯誤是用戶得不到detais - 誰?什麼?什麼桌子?什麼記錄是這個錯誤的罪魁禍首?無法添加一個已使用的密鑰的實體

它會拼命複雜,以確定它,如果你之前.Submit()

做LINQ的對象很多操作有什麼方法來確定什麼肯定造成這個錯誤?

回答

0

這聽起來像你正在做一個Table.Attach()和你附加的實體有一個L2S已經跟蹤的關鍵值。這與物理數據庫中的重複密鑰無關。

+2

沒有粗略的行爲與表(附加,分離任何)。 但仍然模糊爲什麼拋出這個異常 如果我有更多有關異常的詳細信息,我將能夠找出哪些代碼必須修改 – igor 2010-01-11 16:28:38

10

當您在具有外鍵關係且外鍵記錄已存在的MetaTable中創建新記錄時,通常會發生此錯誤。

例如,假設您有一個聯繫人表和一個地址表,並且每個聯繫人可以保存多個地址。當您創建新的聯繫人記錄並嘗試手動將現有的地址記錄關聯到該新的聯繫人時,會發生此錯誤。

假設通過地址ID代表的現有地址的記錄,這不起作用:

public class Contact 
{ 
    public int Contact_ID { get; set; } 
    public string Name { get; set; } 
    public Address ContactAddress { get; set; } 
    public string Phone { get; set; } 
} 

public class Address 
{ 
    public int Address_ID { get; set; } 
    public string Street { get; set; } 
    public string CityState { get; set; } 
    public string ZIP { get; set; } 
} 

public void CreateNewContact(int addressID) 
{ 
    Contact contact = new Contact(); 

    contact.Name = "Joe Blough"; 
    contact.ContactAddress.Address_ID = addressID; 
    contact.Phone = "(555) 123-4567"; 

    DataContact.SubmitChanges(); 
} 

歷史上,SQL開發人員進行培訓,以剛剛通過的ID值,以便神奇的事情發生。使用LINQ到SQL,由於抽象了數據庫活動,因此我們必須傳遞整個對象,以便LINQ引擎可以正確地反映ChangeSet中的必要更改。在上面的例子中,LINQ引擎假設你要求創建一個新的地址記錄,因爲它沒有一個可以處理SubmitChanges並且必須遵守由外鍵關係建立的契約。它使用傳遞的ID值創建一個空白的地址記錄。發生該錯誤的原因是該數據表中已存在此ID值,並且ChangeSet未將地址增量標記爲更新。

解決辦法是在整個記錄來傳遞,而不僅僅是ID值:

contact.ContactAddress = DataContext.Addresses.Where(a => a.Address_ID == addressID).Single(); 

現在,LINQ引擎可以適當旗傳入的地址記錄作爲一個現有的,不要試圖重建它。

1

可能是你想Attach()Remove()Add()DeleteOnSubmit()列,是一個主鍵,您嘗試添加或重新連接相同的值。

另外,您可能正在使用其他方法訪問主鍵或外鍵值列,並且當您嘗試調用上述方法時它尚未關閉。

以上這些方法Attach()Remove()Add()DeleteOnSubmit(),再次嘗試創建您的DataContext的一個新實例,並運行。

0

正如上述答案之一所解釋的,這個錯誤更可能是由於嘗試在主ID標識字段上重複插入一條記錄到表中。您可以通過選擇/創建不同的主鍵來解決問題。

相關問題