2011-08-23 83 views
0

我有接受一個對象的數據上下文的方法,調用連接到其數據庫條目匹配它,刷新並提交任何的改變我做出的對象。該更新第一次正常工作,但當我嘗試第二次更新同一條目時,它開始拋出異常。這裏是我的更新方法什麼:LINQ的更新只工作一次

this.GetTable(data.GetType()).Attach(data, false); 
this.Refresh(RefreshMode.KeepCurrentValues, data); 
this.SubmitChanges(); 

這裏是異常的堆棧跟蹤:

System.Data.Linq.DuplicateKeyException: Cannot add an entity with a key that is already in use. 
at System.Data.Linq.Table`1.Attach(TEntity entity, Boolean asModified) 
at System.Data.Linq.Table`1.System.Data.Linq.ITable.Attach(Object entity, Boolean asModified) 

我失去了一些排序表的刷新?

+0

很好的堆棧跟蹤,但拋出的異常是什麼? –

+0

對不起...我忘了粘貼。我現在加了。 – MBU

回答

2

當您第二次更新實體時,是否將它附加到相同的DataContext實例?如果你是,那就是拋出異常的原因。您只需在DataContext的生命週期中附加一次實體。

+1

這就是答案。 –

+0

我現在明白了。有沒有辦法檢查它是否已連接? – MBU

+0

MBU:檢查的一種方法是調用DataContext.Table.GetOriginalEntityState()。如果它返回null,那麼DataContext不會跟蹤實體。不過,如果DataContext實例的ObjectTrackingEnabled設置爲false,我認爲這不會起作用。 – rossisdead

2
  1. 確認data是不是從this

    我懷疑你試圖附加(data)的實例是從你連接到(即this)相同的上下文。你並不需要附上如果是從同一個實例(它只會更新,當您SubmitChanges()感謝變更追蹤。如果你上面的代碼是一個方法的一部分,我們稱之爲AttachAndSave(),你不能用數據叫它你這種情況下獲取的,或者連續用相同的數據調用兩次,因爲它會嘗試連接相同的數據兩次

  2. 如果data是從不同的DataContext,請嘗試使用asModified參數:

    this.GetTable(data.GetType())。Attach(data,true);

    我懷疑,如果第1點沒有幫助的是,SQL是確定性的g,你想插入一個新的實例而不是修改現有的實例,然後拋出一個異常,因爲你的實例與另一個現有的實例有相同的主鍵。你正在嘗試更新的那個)。但是,這將需要時間戳跟蹤字段,並且不太可能是原因。上面的第1點(附加屬於當前上下文的實例)很可能是您的問題。

+0

如果我切換到真正的它在所有不工作,我得到這個異常,而不是: System.InvalidOperationException:一個實體可以只作爲沒有原始狀態修改,如果它聲明版本成員或者沒有更新檢查策略附。 at System.Data.Linq.Table'1.Attach(TEntity entity,Boolean asmodified) at System.Data.Linq.Table'1.System.Data.Linq.ITable.Attach(Object entity,Boolean asModified) – MBU

+0

Not確定爲什麼它第一次工作,當我嘗試再次更新相同的條目第二次失敗。 – MBU