5

EF 4.2 코드 첫 번째 모델을 사용하는 프로젝트에서 작업 중입니다. 이 모델에는 제품에 대한 TPH 상속 구조가 포함되어 있습니다. 이 상속 모델의 다형성 결과를 판별 자에 그룹화해야하고 몇 가지 문제가 있습니다.엔티티 프레임 워크 4.2 식별자별로 계층 구조 그룹당 테이블

엔티티 프레임 워크는이 구분을 완료하기 위해 판별자를 노출하지 않습니다. 내 첫 번째 질문은이 discriminator에 직접 액세스 할 수 있습니까? 저의 독서와 경험은 아니오라고 말하고 있습니다. 그래서 저는 이러한 해결책을 찾아 냈습니다. 실적이 좋지 않고 유지 관리가 필요한 상황에 만족하지 않습니다.

Public MustInherit Class Product 
     <key()> 
     Public Property ProductID as integer 

     <StringLength(50, ErrorMessage:="Max 50 characters")> 
     <Required(ErrorMessage:="Product name is required")> 
     Public Property Name as String 

     <TimeStamp()> 
     Public Property Time_Stamp as DateTime = DateTime.Now() 
End Class 

Public Class Desktop 
     Inherits Product 

     <StringLength(50, ErrorMessage:="Max 50 characters")> 
     <Required(ErrorMessage:="Processor is required")> 
     Public Property Processor as String 
End Class 

Public Class Monitor 
     Inherits Product 

     <Required(ErrorMessage:="Monitor size is required")> 
     Public Property Size_Inches as Integer 
End Class 

내가 제품을 소요하고 문자열로 baseType 여기서 이름의 반환 확장 방법을 구축 :

내 클래스 (간체)이 같을. 나는 그들을 통해 실행할 수 있도록 그와

<Extension()> 
Public Function ProductType(ByVal inProduct as Product) as String 
     ProductType = inProduct.GetType().BaseType.Name 
End Function 

, 나는 유형별로 그룹에 제품의 결과를이 구조를 구축 :

Dim tmpProducts = db.Products.ToList() 
Dim GrpProducts = tmpProducts.GroupBy(Function(prod) prod.ProductType) _ 
          .Select(Function(s) New With {.ProductType = S.Key, 
                  .Products = S }) 

지금 목록을 반복 내가 원하는 동작을 얻을 수 있습니다, 성능은 이상적이지 않으며 제품 수가 증가함에 따라 용납 될 수 없을 것이라고 우려하고 있습니다.

For Each ProductGroup in GrpProducts 
     Dim TypeName as String = ProductGroup.ProductType 
     Dim TypeProducts = ProductGroup.Products 
Next 

또한이 나에게 공유 된 속성 (이름)에 쉽게 액세스 권한을 부여 할 수 있지만, 지금은 자신의 실제 유형, 유형 이름의 주위에 어쩌면 선택의 경우에 이러한 캐스팅 할 수있는 여러 가지 옵션이 없습니다. . .

위의 코드 오류를 용서해 주시고, 현재 프로젝트에 대한 액세스 권한이 없어 메모리에서 예제를 다시 입력 해 주시면 감사하겠습니다.

답변

2

해결책은 좀 더 모델을 작성하고 ProductType이라는 새로운 엔티티가 Name 인 것입니다. 그러면 ProductProductType 사이에 간단한 1-N 관계가 있습니다. 나는 EntityFramework을 사용하지 않았지만 NHibernate을 사용하면 쉽게 프레임 워크를 쿼리에 조인 할 수 있으므로 성능을 해칠 수있는 Product 각각에 대해 ProductType에 대한 프록시를 반환하지 않습니다. 추가 기능, 미래 ProductType에서이 솔루션에 유연성을 추가 그래서의 즉각적인 비용이 않지만, (예를 들면 그 ProductType의 모든 Product에 대한 일반적인 값으로) 다른 흥미로운 특성을 개발할 수로

데이터베이스에 다른 테이블을 추가합니다.

+0

에 의해 그룹을 해결하는 방법을 얻어야한다. 최근에 오버라이드 할 수있는 "ProductTypeName"속성을 기본 클래스에 추가했습니다. cludgy 느낌과 저장된 데이터를 반복하지만 더 나은 수행합니다. – sgrade1979

1

나는 가능하면 유형 정의에 속하는 일반 속성을 느낄 수 있지만 LINQ 쿼리를 수행하면, 당신을 판별

이 확실히 옵션입니다
from a in db.Records 
group a.ID by new 
{ 
    Name= a is Audio ? "Audio" : 
      a is Video ? "Video" : 
      a is Picture ? "Picture" : 
      a is Document ? "Document" : "File" 
} into g 
select new 
{ 
    Name = g.Key.Name, 
    Total = g.Count() 
}