Dapper에서 멀티 매핑을 사용할 수 없습니다.

c# dapper multi-mapping

문제

Dapper와 함께 놀면서, 지금까지의 결과에 상당히 만족합니다!

그러나 지금, 다음 시나리오는 두 테이블 ( Student 테이블과 Address 테이블)에서 데이터를 읽는 것입니다.

Student 테이블에 StudentID (INT IDENTITY) 의 기본 키가 있고 AddressAddressID (INT IDENTITY) 있습니다. 또한 StudentAddressID 라는 FK를 Address 테이블에 연결합니다.

내 생각은 각 테이블에 대해 하나의 관심있는 속성을 가진 두 개의 클래스를 만드는 것이 었습니다. 또한 Address 클래스의 PrimaryAddress 속성을 C #의 Student 클래스에 추가했습니다.

그런 다음 단일 쿼리에서 학생 및 주소 데이터를 모두 가져 오려고했습니다. Github 페이지 에 표시된 샘플을 모방합니다 .

var student = _conn.Query<Student, Address>
                  ("SELECT s.*, a.* FROM dbo.Student s 
                        INNER JOIN dbo.Address a ON s.AddressID = a.AddressID 
                        WHERE s.StudentenID = @Id", 
                    (stu, adr) => { stu.PrimaryAddress = adr; },  
                    new { Id = 4711 });

여기서 PostUser 가 검색되고 게시물의 소유자가 사용자로 설정됩니다. 반환되는 유형은 올바른 Post 입니까?

따라서 코드에서 일반적인 Query 확장 메소드에 두 개의 매개 변수를 정의합니다. 첫 번째로 Student 가 반환되고 두 번째로 Address 가 Student 인스턴스에 저장됩니다.

var student = _conn.Query<Student, Address>
                  ("SELECT s.*, a.* FROM dbo.Student s 
                        INNER JOIN dbo.Address a ON s.AddressID = a.AddressID 
                        WHERE s.StudentenID = @Id", 
                    (stu, adr) => { stu.PrimaryAddress = adr; },  
                    new { Id = 4711 });

문제는 - Visual Studio에서 오류가 발생했습니다.

제네릭 메서드 'Dapper.SqlMapper.Query (System.Data.IDbConnection, string, System.Func, dynamic, System.Data.IDbTransaction, bool, string, int ?, System.Data.CommandType?)'를 사용하려면 6 개의 형식 인수가 필요합니다.

왜 Dapper가 6 가지 타입의 인수로이 오버로드를 사용하라고 주장하는지 이해가 안됩니다 ...

수락 된 답변

그 API를 변경하고 설명서를 업데이트하는 것을 잊었을 것입니다, 나는 오류를 해결했습니다.

Tests.cs 에서 최신 사양을 확인하십시오.

특히, 이전 API는 매핑을 수행하기 위해 Action<T,U> 을 사용했지만, 문제는 그것이 임의적이고 융통성이 없다는 것이 었습니다. 반환 유형을 완전히 제어 할 수 없습니다. 새 API는 Func<T,U,V> 합니다. 따라서 매퍼에서 반환하는 유형을 제어 할 수 있으며 매핑 된 유형 일 필요는 없습니다.

필자는 다중 매핑에 대해 몇 가지 추가 유연성을 제공하기 위해이 테스트를 통해 다음과 같이 명확히 설명해야합니다.

 var student = _conn.Query<Student,Address,Student>
              ("SELECT s.*, a.* FROM dbo.Student s 
                    INNER JOIN dbo.Address a ON s.AddressID = a.AddressID 
                    WHERE s.StudentenID = @Id", 
                (stu, adr) => { stu.PrimaryAddress = adr; return stu;},  
                new { Id = 4711 }, splitOn: "AddressID").FirstOrDefault();

Dapper는 모든 멀티 매핑 API를 단일 메서드로 파이프하므로 무언가가 실패하면 6 개의 매개 변수로 끝납니다. 퍼즐의 다른 부분은 제가 방금 추가 한 유연한 스플릿을 허용하지 않았다는 것입니다.

splitOn 매개 변수의 기본값은 Id . 즉, id 또는 Id 라는 열을 첫 번째 객체 경계로 사용합니다. 그러나 "3 방향"다중 매핑에 대해 다른 이름을 가진 여러 기본 키에 경계가 필요한 경우 이제 쉼표로 구분 된 목록을 전달할 수 있습니다.

그래서 우리가 위의 문제를 해결한다면 아마도 다음과 같이 동작 할 것입니다 :

 var student = _conn.Query<Student,Address,Student>
              ("SELECT s.*, a.* FROM dbo.Student s 
                    INNER JOIN dbo.Address a ON s.AddressID = a.AddressID 
                    WHERE s.StudentenID = @Id", 
                (stu, adr) => { stu.PrimaryAddress = adr; return stu;},  
                new { Id = 4711 }, splitOn: "AddressID").FirstOrDefault();



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