Dapper - 테이블 상속을 사용하는 여러 결과 집합 매핑

dapper inheritance

문제

다음 클래스 구조와 일치하는 데이터베이스 구조를 매핑하려고합니다. 요소 목록이 포함 된 디자인 클래스가 있습니다. 텍스트, 모양 및 이미지라는 세 가지 유형의 요소가있을 수 있습니다. 나는 추상 클래스를 사용하여 셰이프와 데이터베이스 구조 사이의 공통 속성을 유지합니다.

내 스토어드 프로 시저는 디자인이있는 레코드 세트와 모든 요소가있는 레코드 세트를 반환합니다. 요소 레코드 집합은 왼쪽 조인을 사용하여 비표준 속성과 함께 모든 요소를 ​​반환합니다. 각 요소에는 요소의 유형을 결정하는 ElementTyepID가 있습니다. 디자인 클래스에 List가 포함되어 있습니다. 두 번째 결과 집합을 가져 와서 ElementTypeID를 기반으로 Element의 올바른 하위 클래스에 매핑하는 방법이 있습니까?

public class Design
{
   public int DesignID {get;set;}
   public string DesignName {get;set;}
   public List<Element> ElementList {get;set;}
}

public class Element
{
   public int ElementID {get;set;}
   public int DesignID {get;set;}
   public int ElementTypeID {get;set;}
   public int Width {get;set;}
   public int Height {get;set;}
   public string Color {get;set;}
}

public class ElementText
{
   public int ElementTextID {get;set;}
   public int ElementID {get;set;}
   public string Font {get;set;}
   public string TextValue {get;set;}
}

public class ElementShape
{
   public int ElementShapeID {get;set;}
   public int ElementID {get;set;}
   public int ShapeType {get;set;}
}

public class ElementImage
{
  public int ElementImageID int {get;set;}
  public int ElementID {get;set;}
  public string ImageURL {get;set;}
}




Table: Design
-------------
DesignID int
DesignName varchar(50)


Table: Element
--------------
ElementID int
DesignID int
ElementTypeID int 0-Text, 1-Shape, 2-Image
Width int
Height int
Color varchar(10)


Table: ElementText
------------------
ElementTextID int
ElementID int
Font varchar(50)
TextValue varchar(50)



Table: ElementShape
-------------------
ElementShapeID int
ElementID int
ShapeType int



Table: ElementImage
-------------------
ElementImageID int
ElementID int
ImageURL varchar(255)



Create Table #Designs
(
  [DesignID] [int] NOT NULL,
  [DesignName] [varchar](50) NOT NULL,
)

-- Place all designs into a temp table
Insert Into #Designs
Select DesignID, DesignName from Design

-- Return 1st Result Set (Designs)
select * from #Designs

-- Return 2nd Result Set (Elements)
select * from Element as e
left Join ElementText as t on e.ElementID=t.ElementID
left Join ElementShape as s on e.ElementID=s.ElementID
left Join ElementImage as c on e.ElementID=c.ElementID
Where e.DesignID in (Select DesignID from #Designs)
Order By e.ElementID ASC

전문가 답변

이 조합 접근법은 dapper가 직접 지원하는 방법이 아닙니다. 수평 분할 당 하나의 여러 일반 유형 인수를 허용하고 최종 선택기를 사용하여 올바른 객체를 작성하는 Query<…> API를 사용하면 약간의 행운을 누릴 수 있습니다. 또는 비 제네릭 API를 사용하여 수동으로 열을 추출 할 수도 있습니다 (중복 된 열 이름이있는 경우 문제가 발생할 수 있음).

그러나 무언가를 자동으로하기 위해서는 기능을 고려, 설계, 지정, 구현, 테스트 및 지원해야합니다. 이러한 상황은 아직까지도 발생하지 않았습니다.


인기 답변

기본적으로 제공되는 멀티 맵 API가 작동하지 않는 이유는 알 수 없습니다. 요소 유형은 공통 클래스에서 상속되지 않으므로 모든 클래스를 하나의 튜플로 반환해야합니다 ... 이후에 해당 요소가 null인지 여부를 평가하고 해당 클래스를 사용하여 수행 할 작업을 결정할 수 있습니다.

Query<Element,ElementText,ElementShape,ElementDesign,Tuple<Element,ElementText,ElementShape,ElementDesign>>(<sql>,
(e,et,es,ed)=>{return Tuple.Create(e,et,es,ed)}, spliton:"ElementID,ElementTextID,ElementShapeID,ElementDesignID");

나는 'MessageRecipientType'에 의해 User, Account, Location 객체가 될 수있는 'MessageRecipients'가있는 비슷한 상황에 처해있었습니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.