사용자 정의 SQL을 사용하지 않고 Dapper에서 멀티 맵핑

dapper multi-mapping

문제

Dapper에서 C # 코드에 포함 된 사용자 정의 SQL을 사용하지 않고 일반적인 방법으로 멀티 맵핑을 사용할 수 있습니까?

예를 들어 Dapper에서 Multimapping의 올바른 사용법을 보십시오.

공통 필드가 결합을 위해 자동으로 결정되는 2 개의 관련 엔티티에서 데이터를 쿼리하는 일반적인 방법이 있습니까?

수락 된 답변

이러지 마. 이런 식으로 생각조차하지 마라. 데이터베이스는 오래 지속되고 표준화되었습니다. 객체는 부패하기 쉽고 비정규 화되는 경우가 많습니다. SQL 문을 작성할 때 객체는 신중하게 처리해야합니다. 이것은 실제로 자동화하는 단계가 아닙니다. 길고 고통스런 경험은 많은 사람들이 데이터베이스 추상화 (테이블과 조인)가 코드로 빨려 들어가거나 생성되어서는 안된다는 것을 확신시켜줍니다. 아직 확신이 없으면 기존 ORM을 사용하십시오.

반면에, 당신이 절대적으로 당신의 SQL을 제어하고 싶지만 버그가있는 C #의 문자열 리터럴에 "임베딩"을한다면, 나는 더 동의하지 않을 것입니다. 질문에 대한 C # 래퍼를 생성하는 Visual Studio 확장 프로그램 인 QueryFirst를 제안 할 수 있습니까? SQL은 실제 SQL 파일, 유효성 검증 된 구문, DB 참조가 점검 된 상태로 유지되며 각 저장시 QueryFirst는 Execute () 메소드로 랩퍼 클래스를 생성하고 결과에 대해 POCO를 생성합니다.

다중 매핑을 통해 중첩 된 객체의 그래프를 채우려한다고 가정합니다. 이 작업을 수행하는 좋은 방법은 그래프의 클래스 당 하나의 QueryFirst .sql을 사용하고 부모의 부분 클래스에 하위 List 을 추가하는 것입니다. (QueryFirst가 생성 한 POCO는 두 부분 클래스로 나누어지고 그 중 하나를 제어하고 다른 클래스를 생성합니다.)

그래서, 고객 및 그들의 주문 그래프 ... 부모 SQL

select * from customers where name like @custName

아이 sql

select * from orders where customerId = @customerId

부모 부분 클래스에서 열심히로드하는 중 ...

    public List<Orders> orders;
    public void OnLoad()
    {
        orders = new getOrders().Execute(customerId); // property of the parent POCO
    }

또는 게으른로드 중 ...

    private List<Orders> _orders;
    public List<Orders> orders
    {
        get
        {                
            return _orders ?? _orders = new GetOrders().Execute(customerId);                
        }
    }

대괄호를 포함하지 않는 5 행의 코드로, 느슨하게로드되거나 원하는대로로드 된 네스트 그래프, 코드에서 발견 할 수있는 인터페이스 (입력 매개 변수 및 결과에 대한 인텔리 센스)가 있습니다. 테이블에 수백 개의 열이있을 수 있습니다. 이름은 다시 입력 할 필요가 없으며 데이터 형식이 C #으로 투명하게 흐르게됩니다.

책임의 깨끗한 분리. 총 통제. 면책 조항 : QueryFirst :-)를 썼습니다.


인기 답변

Dapper로 다중 매핑은 한 번에 여러 SQL 쿼리를 실행 한 다음 특정 개체에 매핑 된 각 결과를 반환하는 방법입니다.

이 질문의 맥락에서 Multimapping은 관련성이 없습니다. 주어진 개체에서 SQL 쿼리를 자동 생성하고 올바른 조인을 생성하여 관련없는 단일 SQL 쿼리를 생성하는 방법을 요구하고 있습니다. 다중 매핑.

나는 당신이 찾고있는 것이 Entity Framework의 라인을 따라 무엇인가를 찾고 있다고 생각합니다. 몇 가지 Dapper 확장 프로젝트가 있는데이 중 일부 프로젝트는 SQL을 생성합니다. 참조 : Dapper.Rainbow VS Dapper.Contrib



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