2014-03-06 22 views
0

我試圖插入一些實體到數據庫上下文並刪除它。數據庫上下文插入和刪除錯誤

我現在遇到的麻煩是當我試圖刪除它,它給了我這個錯誤。

System.InvalidOperationException : The object cannot be deleted because it was not found in the ObjectStateManager. 

所以我一派,人們告訴我打電話給.attach()的實體,之後我做了,我得到了

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

所以無論哪種方式,它不工作 - -

一些代碼:

public void delete(WebPointOrderHead item) 
    { 
     WebDataEntities3 dbcDelete = this.dbc; 
     WebPointOrderHead deleteItem = dbcDelete.WebPointOrderHeads.Where(p => (p.OrderID == item.OrderID)).First(); 
     dbcDelete.WebPointOrderHeads.Remove(item) ; 
     dbcDelete.SaveChanges(); 
    } 

    public void insert(WebPointOrderHead item) 
    { 

     WebDataEntities3 dbcinsert = this.dbc; 
     WebPointOrderHead itemToAdd = BusinessLogic.calculatePoints(item, dbcinsert); 
     var IDs = from id in dbcinsert.WEBIDs 
        where id.TableName.Equals("PointOrder_ID") 
        select id; 
     IDs.First().NextID++; 
     var highestID = (from c in dbcinsert.WebPointOrderHeads 
         select c.OrderID).Max(); 
     itemToAdd.OrderID = highestID + 1; 
     dbcinsert.WebPointOrderHeads.Add(itemToAdd); 
     dbcinsert.SaveChanges(); 
    } 
+0

如果您用'dbcDelete.WebPointOrderHeads.Remove(deleteItem);'替換'dbcDelete.WebPointOrderHeads.Remove(item);'它會工作嗎? – rfernandes

回答

2
public void delete(WebPointOrderHead item) 
{ 
    WebDataEntities3 dbcDelete = this.dbc; 
    WebPointOrderHead deleteItem = dbcDelete.WebPointOrderHeads.Where(p => (p.OrderID == item.OrderID)).First(); 
    dbcDelete.WebPointOrderHeads.Remove(item) ; 
    dbcDelete.SaveChanges(); 
} 

有幾件事情^ h關於這個片段。

1)可以清理你的LINQ是這樣的:

WebPointOrderHead deleteItem = dbcDelete.WebPointOrderHeads.First(x=>x.OrderID == item.OrderID); 

我選擇的首選方法,看起來更像是這樣的:

WebPointOrderHead deleteItem = dbcDelete.WebPointOrderHeads.FirstOrDefault(x=>x.OrderID == item.OrderID); 
if(deleteItem == null)return; 

這樣,你有一點點清潔LINQ只有在上下文中找到該記錄時才嘗試刪除該記錄。

2)您正在查詢實體的上下文,但試圖刪除分離的實體。您需要更改.Remove(item)to .Remove(deleteItem);上下文不知道是什麼項目。

3)解決你的插入/更新邏輯。當你使用detatched實體時,你需要檢查ID。如果ID大於0,則需要使用.Attach(),如果ID爲0,則需要使用.Add()

4)我對插入代碼塊感到困惑,它在我看來就像你試圖自己控制實體的ID一樣。這有很多問題:不是線程安全的,不需要的,不好的,等等......如果你將一個實體添加到一個沒有ID的上下文中,它將被插入,並且你的身份將被分配,假設你有一個標識柱。如果您使用現有ID附加()一個實體,則EF將生成一個Update語句。