2012-02-15 4 views
0

DB에서 엔터티를 검색 할 때 "부모 속성"을 포함하는 동적 인 방법을 사용하고 있습니다. 그러나 속성이 값 유형 (또는 문자열)인지 또는 항목의 ienumerable (해당 항목 제외)인지 확인하기 때문에 complextypes로 정의 된 항목도 포함됩니다. 이것은 예외로 이어질 것입니다.Entity Framework 4.3 POCO 포함 복잡한 형식에 예외가 throw됩니다

엔티티가 복합 유형으로 정의되었는지 여부를 확인할 수 있습니까?

public IEnumerable<object> LookupExtent(Type type) 
{ 
     var set = Set(type); 

     DbQuery q = null; 

     foreach (var prop in type.GetParentProperties()) 
     { 
      if (q == null) 
       q = set.Include(prop.Name); 
      else 
       q = q.Include(prop.Name); 
     } 

     return q.ToObjectArray(); 
    } 

PS :

이 예제 코드를 참조하십시오 예 내가 부모 속성이없는 경우이 실패합니다 알고 ...

답변

1

그것은 더 많은 문제가있다. 엔티티에 매핑되지 않은 추가 속성이 추가로 포함 된 경우 어떻게됩니까? EF에 매핑 된 모든 탐색 속성의 이름을달라고 요청할 수 있습니다. EF 메타 데이터로부터 정보를 얻는 것은 거의 과학적이지 않지만 가능합니다.

ObjectContext objectContext = ((IObjectContextAdapter) dbContext).ObjectContext; 
MetadataWorkspace workspace = objectContext.MetadataWorkspace; 
EntityContainer container = 
    workspace.GetEntityContainer("NameOfYourContextClass", true, DataSpace.CSpace); 
EntitySet entitySet = 
    container.GetEntitySetByName("NameOfYourPropertyExposingDbSetOnTheContext", true); 
IEnumerable<string> navigationPropertyNames = 
    entitySet.ElementType.NavigationProperties.Select(n => n.ToString()); 

의 핵심은 GetEntityContainerGetEntitySetByName에 올바른 이름을 제공하고도 사이의 주요 차이점입니다 : (코드는 DbContext API를 사용하는 것으로 예상하지만, 쉽게 ObjectContext는의 API에 변경 될 수 있습니다) 같은 것을보십시오 먼저 코드를 작성하고 db/model을 먼저 작성하십시오. 코드를 처음 사용하는 경우이 이름은 몇 가지 규칙을 따릅니다. EDMX를 사용하는 경우 디자이너에서이 이름을 제어 할 수 있습니다.

어쨌든이 automagic 포함은 사용하지 말아야 할 것입니다. 실제로 필요한 데이터 만 포함하고 항상 complexity of the query을 표시하려면 명시 적으로 수행하십시오.

+0

나는 귀하의 우려 사항을 이해하고 있으며 무엇을 달성하려고하는지는 "기본 사용 사례"가 아닙니다. 매우 특별한 경우에만이 오토 매직을 사용하겠습니다. 기본 경우에는 상위 또는 하위 속성이 포함되지 않으며 해당 속성의로드가 명시 적으로 명시되어야합니다. 나는 당신의 코드를 시험해보고 대답으로 당신의 것을 표시 할 것이다. 나는 사무실에 돌아 왔을 때 (다음 월요일), 조금만 기다려야한다 ;-) – UrbanEsc

관련 문제