2014-03-06 2 views
0

일부 엔티티를 데이터베이스 컨텍스트에 삽입하고 삭제하려고합니다.데이터베이스 컨텍스트 삽입 및 삭제 버그

내가 지금 당장 가지고있는 문제는 삭제하려고 할 때 오류가 발생한다는 것입니다.

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

그래서 내가 봤과 내가

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

그래서 어느 쪽이든, 그것이 작동하지를 가지고 있음을 한 후 사람들은 엔티티에() .attach 전화 말해 - -

을 일부 코드 :

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 (item);'을'dbcDelete.WebPointOrderHeads.Remove (deleteItem);'로 대체하면 작동합니까? – 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(); 
} 

몇 가지의 시간 이 스 니펫에 대해.

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)를 .Remove (deleteItem)로 변경해야합니다. 컨텍스트는 항목이 무엇인지 알지 못합니다.

3) 삽입/업데이트 논리 주소 지정. 분리 된 엔티티로 작업 할 때 ID를 확인해야합니다. ID가 0보다 큰 경우 .Attach()를 사용해야합니다. ID가 0이면 .Add()를 사용해야합니다.

4) 삽입 코드 블록에 혼란 스럽습니다. 자신의 엔티티 ID를 직접 제어하려고하는 것처럼 말입니다. 여기에는 스레드 안전성, 필요 없음, 불량 등 많은 문제가 있습니다 ... ID가없는 컨텍스트에 엔터티를 추가()하면 해당 ID가 삽입되고 ID가 있다고 가정하여 ID가 ​​할당됩니다 기둥. 기존 ID가있는 엔티티를 Attach()하면 EF가 Update 문을 생성합니다.

관련 문제