2012-11-08 11 views
0

이 코드가 작동하지 않는 이유는 무엇입니까? 그것은 개체를 삽입하지만, 그것을 삭제하지 않습니다EF - 개체를 삭제할 수 없습니다.

public int Toggle(RequestArchive RequestArchiveObj) 
{ 
    var ra = DataContext.RequestArchives.Where(rec => rec.UserId == RequestArchiveObj.UserId && rec.RequestId == RequestArchiveObj.RequestId); 

    if(ra.Count() > 0) 
    { 
     foreach (var item in ra) 
     {      
      DataContext.DeleteObject(item); 
     } 
    } 
    else 
    { 
     DataContext.AddToRequestArchives(RequestArchiveObj); 
    } 

    DataContext.SaveChanges(); 
    return RequestArchiveObj.Id; 
} 
+0

어떤 종류의 코드입니까? –

+0

@f_puras, C# 메서드 –

+0

오류가 발생합니까? 'foreach'에 브레이크 포인트를 설정해서 거기에 들어가는 것을 보았습니까? –

답변

1

가 잠재적으로 위험한 문제가 코드와 그리고 문제가 관련이 있습니다

경우 쿼리 개체를 통해 루프 (DataContext.RequestArchives.Where()에 의해 반환 된 객체) 실행하지 않고 루프의 모든 단일 항목에 대해 데이터베이스에 왕복 할 수 있습니다. 이를 N+1 selects problem이라고합니다.

당신이이 ToList() 방법을 사용하여 완화 할 수 있습니다

var ra = DataContext.RequestArchives 
        .Where(rec => 
          rec.UserId == RequestArchiveObj.UserId && 
          rec.RequestId == RequestArchiveObj.RequestId) 
        .ToList(); // this executes the query 
// ... 
foreach (var item in ra) // without ToList() this will query every item by itself 
{      
    DataContext.DeleteObject(item); // and this might collide with the query 
} 

이것에 대해 잘 모르겠지만, 여전히 foreach 루프를 통해 쿼리 동안 개체를 삭제하려고하기 때문에 어쩌면 삭제 문제가 발생합니다. 이 경우 위에서 권장 한대로 ToList()을 사용하면 작동합니다.

+0

WOOOW : 오, 아주 영리합니다. Dennis에게 감사드립니다, 당신의 대답은 나를 놀라게합니다 !!!!! 경외심에 감사드립니다. 어떤 대답이 –

+0

@AliForoughi는 도와 드리겠습니다. –

관련 문제