Entity Framework Code First에서 객체를 분리하려면 어떻게해야합니까?


답변:


156

기존 객체를 분리하려면 @Slauma의 조언을 따르십시오. 변경 사항을 추적하지 않고 객체를로드하려면 다음을 사용하십시오.

var data = context.MyEntities.AsNoTracking().Where(...).ToList();

주석에서 언급했듯이 이것은 엔티티를 완전히 분리하지는 않습니다. 그것들은 여전히 ​​첨부되어 있고 게으른 로딩 작업이지만 엔티티는 추적되지 않습니다. 예를 들어 엔터티를로드하여 데이터를 읽기만하고 수정할 계획이없는 경우에 사용해야합니다.


3
@Ladislav : 이것은 아마도 Lol 코더가 의미 한 바일 것입니다. 나는 종종 객체 목록을로드하고 컨텍스트를 한 번에 배치하지만이 방법에 대해 결코 사용하고 생각하지 않았습니다 using(ctx){ return ctx....ToList(); }. 이러한 경우 AsNoTracking()불필요하게 객체 컨텍스트를 채우는 것을 저장하기 때문에 사용하는 것이 의미가 있습니다. 큰 목록의 경우 성능 및 메모리 소비 이점이있을 것입니다.
Slauma

1
@Slauma : 예, 성능상의 이점이 있습니다. 이것이 실제로이 방법이 존재하는 이유입니다. ObjectContext API에서이 방법을 사용하는 것은 조금 더 복잡합니다.
Ladislav Mrnka

2
지연 로딩을 비활성화합니까?
Shawn Mclean

3
실제로 이것은 지연 로딩을 비활성화하지 않으며 변경 추적 만 비활성화하고 성능을 향상시킵니다. = 엔티티가 여전히 연결되어 있습니다. 이 질문에 답한 후에 그것을 찾았으므로 @Slauma의 답변을 유효한 답변으로 표시해야합니다.
Ladislav Mrnka

1
이것이 내가 원하는거야. 지연 로딩 및 분리 된 엔터티 만 수정하는 기능을 원합니다.
Shawn Mclean

255

이것은 옵션입니다 :

dbContext.Entry(entity).State = EntityState.Detached;

3
IQueryable을 리턴하는 오브젝트를 검색 할 때이를 수행 할 수 있습니까?
Shawn Mclean

1
@ 롤 코더 : 내가 당신을 올바르게 이해하는지 확실하지 않지만 entity모델 클래스 (개인, 고객, 주문 등)의 일부인 유형의 구체화 된 객체 여야합니다. IQueryable <T>에 직접 전달할 수 없습니다 dbContext.Entry(...). 그게 당신이 의미 한 질문입니까?
Slauma

9
@ EladBenda : 그것은 다릅니다. 컨텍스트에 이미 연결된 개체를 분리하려면 상태를로 설정하십시오 Detached. 컨텍스트에 전혀 첨부하지 않고 DB에서 엔티티를로드하려면 (변경 내용 추적 없음)을 사용하십시오 AsNoTracking.
Slauma

1
이 방법에서 흥미로운 문제를 발견했습니다. 엔티티가 프록시 클래스 일 수 있지만 상태를로 변경 한 후에 지연로드가 작동하지 않습니다 Detached.
kjbartel

4
@kjbartel : 엔티티가 컨텍스트와 연결되어 있지 않기 때문에 예상되는 동작입니다.
Ricardo Souza
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.