SqlMapper.Query의 SQL 열 매핑 클래스 속성에

dapper dapper-extensions join mapping

문제

먼저 dapper.net에 대한 많은 경험이 없으며 간단한 문제가있을 수 있습니다.

다중 매핑 기능을 사용하고 싶습니다.

나는 내 문제를 단순화했다.

나는 2 개의 테이블을 가지고있다.

첫 번째 테이블

열 :

  • CARD_ID (PK)
  • CAR_LOCATION
  • CAR_STATUS

두 번째 테이블

브랜드

열 :

  • ID (PK)
  • CARD_ID (FK)
  • 상표명
  • BRAND_LOGO

이 쿼리를 실행해야합니다 :

SQL_CMD :

SELECT * FROM CARS
LEFT JOIN BRANDS
ON CARS.CARD_ID = BRANDS.CARD.ID;

.NET 애플리케이션에서이 테이블을 2 개의 POCO 클래스에 매핑합니다.

public class Car
{
  public int CarId {get;set}
  public string CarLocation {get;set;}
  public string CarStatus {get;set;} 
  public Brand Brand {get;set;}
}

public class Brand
{
  public int Id {get;set}
  public int CardId {get;set;}
  public string BrandName {get;set;}
  public string BrandLogo {get;set;}
}

위의 SQL cmd를 질의 할 때 :

        var data = connection.Query<Car, Brand, Car>(SQL_CMD, (car, brand) =>
        {
            car.Brand = brand;
            return car;

        }, commandTimeout: 50000, splitOn:"ID")

나는 빈 결과를 얻는다.

IMHO 문제는 클래스 속성에 SQL 열을 매핑하는 것입니다. 왜냐하면 prop.CarId를 Car.CAR_ID로 변경하면이 속성이 채워지기 때문입니다.

SqlMapper.Query<T1,T2,TReturn> 클래스 속성에 "SQL 열"을 클래스 속성에 매핑하는 방법이 있습니까?

나는 ClassMapper 가 존재 ClassMapper 것을 알고 있지만이 시나리오에서 사용하는 방법을 찾지 ClassMapper .

감사

편집 :

매핑 클래스 추가를 시도했지만 작동하지 않습니다.

public class CarMapper : ClassMapper<Car>
{
   Table("CARS");
   Map(c=>c.CarId).Column("CAR_ID").KeyType(KeyType.Assigned);
   Map(c=>c.CarLocation).Column("CAR_LOCATION");
   Map(c=>c.CarStatus).Column("CAR_STATUS");
}

public class BrandMapper : ClassMapper<Brand>
{
   Table("BRANDS");
   Map(c=>c.Id).Column("ID").KeyType(KeyType.Assigned);
   Map(c=>c.CarId).Column("CAR_ID");
   Map(c=>c.BrandName).Column("BRAND_NAME");
   Map(c=>c.BrandLogo).Column("BRAND_LOGO");
}

매핑 어셈블리 추가

DapperExtensions.DapperExtensions.SetMappingAssemblies(new List<Assembly>
{
    Assembly.GetAssembly(typeof(CarMapper)), 
    Assembly.GetAssembly(typeof(BrandMapper)),                                                         
});

이 설정 실행 쿼리 후

    var data = connection.Query<Car, Brand, Car>(SQL_CMD, (car, brand) =>
    {
        car.Brand = brand;
        return car;

    }, commandTimeout: 50000, splitOn:"ID")

내가 작동하지 않는다는 말을하면 객체의 속성은 비어 있지만 간단한 삽입을 시도하면 업데이트 또는 삭제가 작동합니다.

나는 지금 문제의 근원이 될 수있는 곳을 혼동하고있다.

인기 답변

Dapper Extensions는 가져 오기, 삽입, 업데이트 및 삭제라는 두 가지 확장 기능을 제공하므로 두 번째 예제는 제대로 작동하지 않습니다. 검색어 확장은 Dapper 핵심 부분입니다. 내가 말할 수있는 한 Dapper Extensions는 다중 매핑을 지원하지 않습니다.

내가 생각할 수있는 유일한 옵션은 select 문을 수정하고 속성의 이름을 바꾸는 것입니다. 예를 들면 다음과 같습니다.

SELECT CAR_ID as CarId, CAR_LOCATION as CarLocation, CAR_STATUS as CarStatus, etc.
FROM CARS
LEFT JOIN BRANDS
ON CARS.CARD_ID = BRANDS.CARD.ID

그런 다음 다중 매핑이 작동해야합니다.

또한 ID로 분할하는 경우 splitOn을 지정할 필요가 없습니다. Dapper가 자동으로 ID 필드를 나눕니다.

Dapper는 기본 키가 다르거 나 "Id"가 아닌 다른 위치에서 넓은 행을 분할하려는 경우 Id 열의 이름이 "Id"또는 "id"로 가정하고 선택적 'splitOn'매개 변수를 사용합니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow