2012-01-15 2 views
2

이 엔티티 프레임 워크 호출이 실제로 데이터베이스를 두 번 방문합니까?Entity Framework - DeleteObject에서 데이터베이스로 이동 한 횟수

var result = from p in entities.people where p.id == 6 select p; 
    entities.DeleteObject(result); 

그것은 어쩌면 DeleteObject 매크로가 작동 할 수있는 삭제 기능을 수행 할 목적을 가지고, THEN 결과를 얻을하고 첫 번째 여행을 강제 저를 친다.

그런 경우 두 번째 여행을 어떻게 피할 수 있습니까? 단일 데이터베이스 트립을 통해 엔티티 프레임 워크에서 제거 별 쿼리를 수행하는 방법은 무엇입니까?

감사합니다. 이 기본 키에 의해 쿼리 이었기 때문에

편집

내 원래의 예는 오해의 소지가 있었다. 진짜 질문은 IQueryable에서 항목을 삭제할 수있는 단일 트립 기능을 갖는 방법이 있는지 여부입니다. 예를 들어 :

var result = from p in entities.people where p.cityid == 6 select p; 

    foreach (var r in result) 
    { 
     entities.DeleteObject(r); 
    } 

은 (쿼리 외래 키입니다 알 수 있습니다, 그래서 여러 결과가있을 수 있습니다).

+1

이전에 질문되었습니다 -이 답변 http://stackoverflow.com/questions/869209/bulk-deleting-in-linq-to-entities/870081#870081 일괄 업데이트를 구현하는 방법을 설명하는 문서 링크 'UPDATE ... SET ... WHERE ...'형식으로, 'DELETE ... WHERE ...'질의를 생성 할 수 있어야합니다. – hvd

답변

1

직접 삭제 :

var people = new people() { id = 6 }; 
entities.people.Attach(people); 
entities.people.Remove(people); 
entities.SaveChanges(); 

당신이 fire up a profiler 자신을 위해 그것을보고합니다.

편집 :

이 당신이 Linq에를 사용 할 수 있지만, 하나의 여행을하지 않습니다.

var peopleToDelete = entities.people.Where(p => p.id == 6); 

foreach (var people in peopleToDelete) 
    entities.people.DeleteObject(people); 

entities.SaveChanges(); 

은 EF의 상자 밖으로 그렇게 할 수있는 쉬운 방법은 없습니다, 참으로 큰 성가심 (한 사람은 개인적으로하지 않는, 직접 SQL를 사용에 의존하지 않는 한). 다른 포스터 중 하나는 을 사용하여 자신의 기능을 만드는 방법을 설명하는 this article에 연결된 대답에 연결됩니다.

+0

diggingforfire에게 감사드립니다. 내 편집 내용을 확인하십시오. 원래의 질문은 충분하지 않았습니다. – carlbenson

+0

지연된 실행을 이해하면 foreach는 예제에서와 같이 db 호출을 강제 실행하는 트리거입니다. 체크 아웃 : http://blogs.msdn.com/b/charlie/archive/2007/12/09/deferred-execution.aspx – carlbenson

+0

나는 'best bet'이 의미하는 바를 분명히 했어야했다. 편도 여행이 아닌 Linq를 사용할 수 있습니다.내 대답을 업데이트했습니다. – diggingforfire

1

당신은 이런 식으로 작업을 수행 할 수 있습니다

entities.ExecuteStoreCommand("DELETE FROM people WHERE people.cityid={0}", 6); 

이 그것을 할 수있는 하나 확실히 데이터베이스에 여행하고 효과적인입니다.

편집 : 또한 here을 보면 동일한 해결책을 제시합니다. 그리고이 질문에 대답하기 위해 엔티티 프레임 워크를 사용하는 데이터베이스에서 기본 키에 의해 참조되지 않는 엔티티를 가져 오지 않고 (this 답변과 같은 몇 가지 도우미 확장 메소드를 작성하지 않고) 엔티티를 삭제할 수있는 유일한 방법입니다.

+0

'DELETE' SQL 문을 직접 실행하는 것은 단 한 번의 여행이지만 확실한 답은 아닙니다. – diggingforfire

+0

당신이 옳습니다. 질문에 대한 직접 응답으로 답변을 업데이트했습니다. –