2009-05-12 2 views
0

편집 :Should Entity Framework Context be Put into Using Statement?엔티티 프레임 워크 : 내 오브젝트 컨텍스트를 폐기하지 않으면 어떤 부작용이 발생할 수 있습니까?

내가 나쁜 제대로 내 개체 컨텍스트를 폐기하고는 GC와 함께 죽을 허용하지 않음으로써 발생할 수 있는지 궁금 약간의 시간이 아이디어를 주위에 던져 봤는데의 중복. 일반적으로, 나는 이것을 피할 것이지만 그것을 할 타당한 이유가있다.

우리는 부분 클래스를 사용하고 있습니다. 이러한 부분 클래스에서는 FK 객체에 액세스하는 속성을 노출합니다. 예를 들어 CustomerType FK 객체가있는 Customer 클래스가 있다고 가정 해 봅시다. 원래 쿼리가 .Include ("CustomerType")를하지 않은 경우

public string CustomerTypeName { 
    get { 
    if (CustomerType == null) { 
     CustomerTypeReference.Load() 
    } 

    return CustomerType.CustomerTypeName; 
    } 
} 

이 매우 편리 밖으로 작동 : 클래스에서,이를 수행하는 CustomerTypeName 속성을 노출합니다.

그러나 컨텍스트를 삭제하면 위의 속성이 더 이상 작동하지 않습니다. 그래서 ... 이것이 두 가지 질문으로 이어질 것 같습니다 :

1) 명시 적으로 컨텍스트를 처분하지 않으면 어떤 음란물이 있을까요?
2) 위의 시나리오에서 지연로드를 수행하고 컨텍스트를 처리하는 다른 방법이 있습니까?

답변

2

글쎄, 많은 새로운 객체를로드/계속 유지하지 않는 한 무한히 남아있는 ObjectContext는 괜찮습니다.

로드되거나 추가 된 모든 객체는 처리 될 때까지 항상 ObjectContext에 의해 추적되므로 처분하지 않으면 더 많은 객체를 추적 할 수 있습니다. 그러면 더 커질 것입니다.

당신이 할 수있는 한 가지 옵션은 몇 가지 유틸리티 메서드를 사용하여 잘 알려진 컨텍스트에 액세스하거나 임시 컨텍스트를 만드는 것입니다.

이 키는 EntityReference.EntityKey를 사용하고 두 엔터티가 모두 분리되어 있는지 확인하는 것입니다. 원래 개체 대상이 너무 분리되어있는 경우

public static T GetDetachedObjectByKey<T>(EntityKey key) 
    where T: EntityObject 
{ 
    using (MyContext ctx = new MyContext()) 
    { 
     T t = ctx.GetObjectByKey(key) as T; 
     ctx.Detach(t); 
     return t; 
    } 
} 

이에만 작동합니다 :

this.CustomerType = Utility.GetDetachedObjectByKey<Customer>(
     this.CustomerTypeReference.EntityKey); 

GetDetachedObjectByKey의 기본 구현은이 같은 것입니다. 이 방법으로 사용 된 컨텍스트가 어디서 왔는지 실험 할 수 있습니다.

희망이 내가 틀렸다면

알렉스

0

화면의 길이에 대한 컨텍스트를 유지하지 않으시겠습니까?

+1

저를 수정하는 데 도움이,하지만 내 GUI에서 컨텍스트를 추적해야 할 것 의미 할 것입니다. 계층화 된 아키텍처에서는 조금 더러운 느낌입니다. – bugfixr

+0

더 이상 무시하고 그것을 버릴 희망보다 더러운 :) – gbjbaanb

+0

어쨌든 당신은 GUI에서 그것과 상호 작용하고 있습니다. 그것을 처분 함으로서 당신은 당신이 그것으로 끝났다고 자원에게 말하고 있습니다. 정의에 따르면 게으른로드가있을 경우 아직 완료하지 않은 것입니다. 간단한 IComponent 래퍼를 만들고 폼 컴포넌트에 추가하기 만하면 또 다른 걱정이나 코드 라인이 없어도 정리할 수 있습니다. –

3

answer에서 'LINQ to SQL - where does your DataContext live?'까지는 페이지 수명 기간 동안 DataContext의 소유자로서 페이지를 보유하고 있으며 페이지 자체가 폐기 될 때 DataContext를 적절하게 삭제하는 페이지입니다.

@Chu는 약간 더러움을 지적하지만, UI에서 직접 데이터 전송 객체를 사용한다면 UI가 DataContext의 수명을 제어해야합니다.

+0

나는 똑같은 짓을한다. System.Web.UI.Page에서 상속받은 기본 페이지를 사용합니다. 페이지 수명 기간 동안 단일 인스턴스를 보장하는 DataContext 속성이 있습니다. (요청하면 코드를 공유합니다.) –