2010-07-08 6 views
3

내 응용 프로그램은 응용 프로그램의 수명 동안 존재하는 하나의 컨텍스트 인스턴스를 사용합니다. Entity Framework를 사용하여 모든 데이터를 읽고 데이터베이스에 씁니다. 객체를 추가 한 후에는 가비지 컬렉터가 객체를 정리하여 메모리에 남아 있지 않게하려고합니다. 나는 다음을 시도했다 :context.detach - 가비지 수집 용

While context.BatchProgresses.Count > 0 
     context.Detach(context.BatchProgresses.First()) 
    End While 

그러나 이것은 무한 루프로 진행된다. Context.Detach() 항목을 Context.BatchProgresses에서 삭제해야합니까?

+1

싱글 톤 컨텍스트는 정말 나쁜 아이디어 *이며 비참하게 끝날 것입니다. 컨텍스트는 작업 단위입니다. 귀하의 작업 단위는 "내 앱의 전체 수명"이 아닙니다. –

+1

조언을 주셔서 감사합니다. 나는 여러 가지 상황으로 작업을 끝내었다. 처음에는 타이머 루프 내에서 컨텍스트를 만들고 파기하는 성능에 대해 걱정했기 때문에 처음에는이 전략을 사용하지 않았지만 성능에 거의 영향을주지 않는 것으로 나타났습니다. – Terry

답변

1

데이터베이스 쿼리 재 있지만, 문맥에 부착 된 엔티티와 함께 ​​작동하지 않으려면, 당신은 할 수 ObjectStateManager를 사용하십시오.

var attachedEntities = context. 
         ObjectStateManager. 
         GetObjectStateEntries(EntityState.Added | 
              EntityState.Deleted | 
              EntityState.Modified | 
              EntityState.Unchanged). 
         Where(ent => ent.Entity is BatchProgress). 
         Select(ent => ent.Entity as BatchProgress). 
         ToList(); 

foreach (var attachedEntity in attachedEntities) 
{ 
    context.ObjectStateManager.ChangeObjectState(attachedEntity, EntityState.Detached); 
} 

ObjectState를 EntityState.Detached로 설정하면 컬렉션에서 엔티티가 제거됩니다. 마지막에 attachedEntities를 다시 가져 와서 확인할 수 있습니다. 아무 것도 없을 것입니다.

0

BatchProgress.First() 호출은 데이터베이스 읽기를 유발할 수 있습니다. 로거 또는 SQL 프로파일 러에 의해 호출로 인해 SQL 활동이 수행되지 않도록하십시오. 또한

당신이 코드를 다음 시도 할 수 있습니다 (C 번호) 등의 경우에 평소처럼

var list = context.BatchProgress.ToList(); 
foreach(var item in list) 
    context.Detach(item); 
+0

불행히도 context.BatchProgresses.ToList()는 db 쿼리를 발생시킵니다. – Yakimych