2013-02-19 75 views
0

我正在使用EF4.1,RIA Services和Silverlight。我在更新場景中遇到了一些有點奇怪的問題。使用RIA服務更新實體時出現奇怪的InvalidOperationException

域模型非常簡單;它涉及請求。他們有一對一的關係。因此,公民可以有多個請求,但實際上這絕不會發生,因爲該應用程序根本不提供這樣做的功能。

請求有一個名爲「緊急」屬性,這是我改變真正,然後嘗試保存。一切順利的話,直到實際持續存在通過這種方法開始:(除了我添加了調試目的在try/catch處理)

public void UpdateRequest(Request currentRequest) 
    { 
     Request original = ChangeSet.GetOriginal(currentRequest); 
     try 
     { 
      ObjectContext.Requests.AttachAsModified(currentRequest, original); 
     } 
     catch (Exception ex) 
     { 
      // weirdness here! 
     } 
    } 

這是相當多的RIA服務標準生成的方法然後我得到以下錯誤:

當我檢查的變更,有沒有請求要添加,所以我敢肯定,我不是偶然添加。

An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key. 

我不明白這一點......從字面上有在ObjectStateManager沒有添加的對象,該變更有沒有添加的對象;這是從哪裏來的?我跟蹤了哪些屬性正在更改,所以我確定密鑰不會被覆蓋,也不會被添加或其他某些時髦。

任何人都可以在這裏發光?快把我逼瘋了好幾天了那麼遠,

+0

我不認爲這是你在其他地方加入它的問題。在執行此更新方法之前是否有可能加載實體的代碼?另一個查詢在同一往返中執行? – 2013-02-19 15:54:49

+0

你在CallStack窗口中看到什麼?你不能追蹤持續的操作呼叫嗎? – 2013-02-19 21:34:30

+0

正如Anthony Pegram所提到的,只要您使用相同的密鑰加載實體,就無法附加模型。這些更改必須應用於附屬實體。 – Ouarzy 2013-02-20 07:31:50

回答

0

我設法使用下面的邏輯來解決它,如果實體已連接基本上我們正在檢查。如果是這樣,我們不重新附加它,只是更新值。否則,我們附上它。

 ObjectStateEntry entry; 
     // Track whether we need to perform an attach 
     bool attach; 
     if (ObjectContext.ObjectStateManager.TryGetObjectStateEntry(ObjectContext.CreateEntityKey("Requests", currentRequest), out entry)) 
     { 
      // Re-attach if necessary 
      attach = entry.State == EntityState.Detached; 
     } 
     else 
     { 
      // Attach for the first time 
      attach = true; 
     } 
     if (attach) 
     { 
      ObjectContext.DocumentRequests.AttachAsModified(currentRequest, original); 
     } 
     else 
     { 
      ObjectContext.Requests.ApplyCurrentValues(currentRequest); 
     }