2012-11-12 2 views
2

간단한 이해로 해결할 수 있다고 생각되는 문제가 있습니다. Entity Framework 5에서 코드를 먼저 사용하고 POCO를 사용하고 있습니다. 모든 POCO 객체에 대해 모든 탐색 속성이 올바르게 구성되었습니다 (가상). 문제는 개체 (POCO)를 쿼리 한 다음 해당 POCO를 결과로 반환 할 때 발생합니다. POCO에 대한 모든 탐색 속성은 null'ed됩니다네비게이션 속성이 null 인 EF5 및 분리 된 POCO

class PocoParent { // all of these are properties (get/set) 
    public int Id; 
    public string ParentProperty; 
    public virtual PocoChild NavProperty; 
} 
class PocoChild { 
    public int Id; 
    public int ParentId; 
    public string Name; 
    public virtual PocoParent Parent; 
} 

을 내 쿼리 처리하는 저장소 클래스 내부의

... 
var children = repo.GetAllChildrenFor(queriedParent.Id); 
... 

지금 결과를 사용 :

IEnumerable<PocoChildren> GetAllChildrenFor(int parentId) { 
    using(Context db = new Context()) { 
     var pcs = db.PocoParents.Where(p => p.Id == parentId); 
     return pcs; 
    } 
} 

은 이제 저장소를 사용을 리포지토리에서 다음과 같이 오류가 발생합니다.

... 
foreach(child in children) { 
    if(child.Parent.NavProperty == "null") { !!! Exception: child.Parent ObjectContext already disposed 
    } 
} 
... 

(어떻게 POCO 객체를 분리하기 위해) ObjectContext를 처리 할 수 ​​있지만 적어도 한 레벨의 탐색 속성을 유지할 수 있습니까? 나는 끝없이 해결책을 찾았지만 해결책을 모으는 방법에 관해서는 모두 상반되는 것처럼 난처하게되었다.

나는 다음에 저장소에서 쿼리를 변경한다면 --- 요점을 되풀이 ---- 아래의 답을 , 상기 모든 enities을 반환

IEnumerable<PocoChildren> GetAllChildrenFor(int parentId) { 
    using(Context db = new Context()) { 

     var pcs = db.PocoParents.Include(p => p.Select(prop => prop.Parent).Where(p => p.Id == parentId); 

     return pcs; 
    } 
} 

겠습니까 그들은 것이다 null이 아닌 .Parent 속성이나 내가 지정한 모든 속성을 포함합니까?

답변

2

기본적으로 지연로드가 활성화되어 있으며 탐색 가능한 속성이 null 인 이유입니다. 게으른로드는 요청할 때까지 탐색 가능한 속성이로드되지 않음을 의미합니다. 그리고 요청 된 컨텍스트가 사라지면 컨텍스트를로드 할 수 없으므로 null로 설정됩니다.

이 문제를 해결하려면 지연로드를 비활성화하거나 명시 적으로 (그리고 간절하게) 필요한 속성을로드해야합니다.

MSDN magazine article은 어떤 경로가 가장 적합한 지 결정할 수있는 좋은 출처입니다.

+0

감사합니다. 지금은 이해할 수 있습니다. 나는 당신이 그것을 확인하는 것을 원하지 않는다면 평가를 위해 맨 아래에 나의 질문을 다시 썼다. –

+1

나는 항상 Include라는 람다 버전에 불운을 겪었다. 그래서 저는 그것을 다음과 같이 작성합니다 : ... 포함 ("부모"). 어디에 ... 그렇지 않으면, 네가 가지고 있다고 생각해. –

관련 문제