我有一些邏輯,其中POCO實體的圖形需要克隆,並做到這一點,我已經創建了每個T4生成的自我跟蹤實體的部分類,並在每個實現ICloneable。每個實體都可以克隆自己,並在其導航屬性中迭代其所有子項,並在每個子實體上調用Clone(),最後返回克隆的自己的克隆實例和添加的克隆子項。所以這是一個很深的克隆,並且工作正常。在克隆樹中,所有實體都處於新增狀態,這很有意義,因爲克隆圖是全部新實體。EF4自我跟蹤實體:MarkAsDeleted後的OptimisticConcurrencyException
克隆進程在實體上下文中扮演着服務端的角色,雖然克隆進程本身沒有完成數據訪問,但克隆是在數據庫的新檢索圖上執行的(如果有更好的克隆方法一個實體圖可以隨時通知我......)。
現在克隆的圖形通過WCF發送到我們的Silverlight 4應用程序,並在那裏顯示。用戶可以即時保存或添加/修改此圖中的數據,然後將其保存回服務中,不會出現問題,但是,如果它們從圖中刪除任何節點,則會出現問題。
當用戶單擊某個控件以刪除節點時,我通過調用MarkAsDeleted()來更改實體圖。這適用於未更改的圖形,但對於克隆的圖形,所有內容都處於Added狀態,在WCF服務中保存回數據庫時,我收到了OptimisicConcurrencyException。
「存儲更新,插入或刪除語句影響了意外數量的行(0)。實體可能已被修改或刪除,因爲實體已加載。刷新ObjectStateManager條目。
在我打電話
context.EntitySetX.ApplyChanges(entityNodeInTree)的服務;
context.SaveChanges();
這一切都很好,除了在這種情況下。到目前爲止,用戶的工作是將克隆的圖保存回數據庫,再次檢索(現在都將保持不變),然後刪除他們希望的任何數據並最終再次保存。
我不明白爲什麼會發生這種情況。是不是MarkAsDeleted處於添加狀態的東西?這對我沒有任何意義,因爲在使用我們的Silverlight應用程序時,有些項目會同時添加並從圖表中刪除,並且這不會導致問題。
任何想法?
謝謝
錯誤消息的含義正是它所說的。跟蹤SQL。這並不是框架所期望的。查看SQL應該可以幫助你確定錯誤。 – 2010-08-06 13:06:22
由於沒有生成SQL,因此SQL Trace是無用的。這是一個實體框架STE問題。在嘗試向數據庫中插入任何內容之前,會出現併發異常。 – MrLane 2010-08-09 04:40:11
更新:只有在客戶端執行MarkAsDeleted時纔會出現此問題(因此在對整個圖進行反序列化後導致更改跟蹤處於打開狀態)。如果我在服務器端MarkAsDeleted,然後堅持回來,即使克隆和MarkAsDeleted在一個實體上下文之外完成,行爲是如預期的。 – MrLane 2010-08-09 06:51:53