2012-07-21 2 views
1

Type 테이블에 외래 키인 TypeId 열이있는 BaseTable이 있습니다. 계층 패턴 당 템플릿을 사용하여이를 엔티티 프레임 워크 모델로 매핑했습니다.Entity Framework TPT 상속 - 데이터베이스에서 얻는 방법?

이제 BaseClassSubClass1SubClass2이라는 두 개의 하위 클래스가 있고 BaseClass를 abstract으로 만듭니다.

내 페이지에서 두 번째 페이지로가는 ID (물론 ID는 BaseClass입니다.)이며 데이터베이스에서이 개체를 가져오고 싶습니다.

내 검색어는 어떻게 작성합니까? 오는 id는 물론 Subclass가 소유합니다. 예를 들어

, 나는 다음과 같이 쓸 수 있습니다 :

BaseClass object = provider.getfrombaseclassbyid(id); 

나는이 같은 권투를 할 수 있습니까? 할 수 있다면, 어떻게하면 객체가 실제로 무엇인지 알 수 있습니다. Subclass1 또는 Subclass2입니까? 내가 어떻게 알 수 있니?

내가 어떻게해야합니까?

답변

0

나는 다음은 귀하의 질문에 대답을하면 잘 모르겠지만, 할 수 있습니다 실제로 쿼리 추상적 인 실체를 respresents 세트에 : 결과가없이 예를하기 때문에 유형 BaseClass이 될하지 않습니다 물론

BaseClass entity = context.BaseClasses.SingleOrDefault(b => b.Id == id); 

추상 형식을 만들 수 있습니다. 유형이 SubClass1이거나 SubClass2이거나 id 인 엔티티가없는 경우 null입니다. Entity Framework는 Discriminator 열 값 (TPH (Table-Per-Hierarchy) inentalance)을 확인하거나 기본 테이블에서 파생 테이블의 테이블을 조인하여 개체를 만들 때 사용할 형식을 결정할 수 있습니다 유형 (테이블 당 유형 (TPT) 상속)

string typeName = entity.GetType().Name; // will be "Subclass1" or "Subclass2" 

또는 :

당신은 사용하여 예를 들어 구체화 된 유형을 확인할 수 있습니다

if (entity is SubClass1) 
    // ... 
else if (entity is SubClass2) 
    // ... 

을 당신은 당신이 사용할 수 SubClass1 유형의 엔티티를로드 할 것을 미리 알고 있다면 OfType<T> 연산자 :

SubClass1 entity = context.BaseClasses.OfType<SubClass1>() 
    .SingleOrDefault(b => b.Id == id); 

엔티티 w i가 주어진 idSubClass1이 아니라 SubClass2이 아닌 경우이 쿼리의 결과는 null이됩니다. 그렇지 않으면 SubClass1이 보장됩니다.

관련 문제