2009-12-03 36 views
2

「嘗試附加或添加一個不是新的實體,可能是從另一個DataContext加載的實體。不支持。」LINQ TO SQL錯誤:嘗試附加或添加一個非新的實體

我有場景很多解決方案處理Attach()方法,但我只是想添加一個新的記錄。不知道發生了什麼事。

這裏是我的代碼,它是失敗的star'd線:

try 
      { 
       LINQDataContext datacontext = new LINQDataContext(); 


       TrackableItem ti = datacontext.TrackableItems.FirstOrDefault(_t => _t.pkId == obj.fkTrackableItemId); 
       arcTrackableItem ati = new arcTrackableItem(); 
       ati.barcode = ti.barcode; 
       ati.dashNumber = ti.dashNumber; 
       ati.dateDown = ti.dateDown; 
       ati.dateUp = ti.dateUp; 
       ati.fkItemStatusId = ti.fkItemStatusId; 
       ati.fkItemTypeId = ti.fkItemTypeId; 
       ati.partNumber = ti.partNumber; 
       ati.serialNumber = ti.serialNumber; 
       ati.archiveDate = DateTime.Now; 

       datacontext.arcTrackableItems.InsertOnSubmit(ati); 
       datacontext.SubmitChanges(); 


       arcPWR aItem = new arcPWR(); 
       aItem.comments = obj.comments; 
       aItem.fkTrackableItemId = ati.pkId; 
       aItem.fkPWRStatusId = obj.fkPWRStatusId; 
       aItem.PwrStatus = obj.PwrStatus; 


       **datacontext.arcPWRs.InsertOnSubmit(aItem);** 
       datacontext.SubmitChanges(); 

回答

3

看起來像obj是使用不同的dataContext構建的,需要使用相同的dataContext創建,而不是實例化一個新的。

一個快速的解決方案可能是傳入一個dataContext,而不是在這個方法中實例化一個新的。

0

什麼是 「PwrStatus」?如果這是一個Linq2SQL對象,那麼通過在aItem中設置引用將該對象附加到新的數據上下文。

EntityFramework肯定會走下你的對象樹,並將所有對象附加到它的上下文中。我認爲Linq2Sql也是。

0

A quick solution might be to pass in a dataContext rather than instantiating a new one inside this method

如果你這樣做,那麼你就不能放棄(撤銷)的變化的情況下,還有,當你打的SubmitChanges拋出一個錯誤()。

您可以手動設置任何關係的外鍵,並立即調用SubmitChanges。 如果關係已經有一個定義的外鍵,那麼你會得到一個錯誤,並需要分配對象。在你的情況下,ati.ItemStatus = newItemStatus。但在這種情況下,您需要保存在相同的數據上下文中,這不會讓您撤銷更改。 :(

1

代表外鍵的字段(ati.fkItemStatusId = ti.fkItemStatusId,例如)需要在當前的背景下存在的嘗試是這樣的:

ati.fkItemStatus = dataContext.ItemStatuses.SingleOrDefault(
    d=>d.ItemStatus.ItemStatusId.Equals(ti.fkItemStatusId); 

如果你這樣做,外鍵對象將存在於上下文中,因爲您已經將它拉出來了。不要擔心性能問題 - 它會被包裝成一個簡單的SQL語句。

相關問題