2014-10-20 2 views
4

레거시 데이터베이스에서 생성 된 내 Entity Framework 엔터티를 사용자 지정 DTO 개체에 매핑하려고합니다 (좋고 깨끗해야 함).다른 속성 유형이있는 AutoMapper 개체

내 기존 DB는 다음과 같이 조금보고 기관이 있습니다

internal class Order { 
    int id; 
    string Shipping_date; 
    string quantity; 
} 

을 그리고 난 더 좋은 DTO 객체에 매핑 할 : 내가 "개체 컨테이너"를 작성했습니다

public class OrderDto { 
    int id; 
    DateTime? ShippingDate; 
    int Quantity; 
} 

의존성 주입을 제공하면 다음과 같이 값을 반환합니다.

public IEnumerable<OrderDto> GetPaginatedOrders(int page, int pageSize) 
{ 
    return this.db.Orders 
       .OrderByDescending(c => c.id) 
       .Paginate(page, pageSize) 
       .Project() 
       .To<OrderDto>() 
       .AsEnumerable(); 
} 

그래서 유형 변경 및 p 로퍼티 이름.

Mapper.CreateMap<Order, OrderDto>() 
    .ForMember(dest => dest.Quantity, opt => opt.MapFrom(src => src.quantity)) 
    .ForMember(dest => dest.ShippingDate, opt => opt.MapFrom(src => src.Shipping_date)); 

이 유형의 변화에 ​​충분하지 않다 :

은 속성 이름의 변화는 지루하기 쉬운하지만-것을이었다.

  • src => int.Parse(src.quantity)과 같은 매핑 선언에서 속성을 구문 분석하지만 Linq은이를 좋아하지 않습니다.
  • QuantityInt { get { return int.Parse(this.quantity) } }과 같은 사용자 지정 속성으로 EF 엔터티를 확장하고 매핑에서이 속성을 사용하지만 AutoMapper는이를 좋아하지 않으며 명시 적으로 지원하지 않습니다.
  • Mapper.CreateMap<string, int>().ConvertUsing(Convert.ToInt32)과 같은 시스템 유형이 서로 매핑되지만 여전히 Unable to create a map expression from System.String to System.Int32 오류가 발생합니다.
  • 내 클래스에 대한 사용자 지정 변환기를 사용하지만 런타임시 내 개체에서 항상 ResolutionContext.SourceValues의 빈 값을 가져옵니다. AutoMapper가 가져 오기 전에 삭제 된 것 같습니다.

저는 AutoMapper가 대회 방식이라는 것을 알고 있습니다. 그래서 다른 도구를 사용해야 할 수도 있지만 어느 것이 있습니까?

도움 주셔서 감사합니다.

+0

db 쿼리 (linq) 내부에 매핑되어 있지만 ToList, First, Single 등을 호출 한 후 최종 개체 자체는 매핑하지 않은 것 같습니다. 그래서 당신이 엔티티를 먼저 쿼리 한 다음 맵핑을 시도해야한다고 생각합니다. –

+0

조만간'Mapper.Map (...)'을 사용하여 쿼리를 매핑하거나 'Automapper.QueryableExtensions'의 Queryable Extensions 네임 스페이스에서'.Project(). To ()'하고 있습니까? –

+0

질문에 사용 샘플을 추가했습니다. Project()를 사용하고 있습니다. 쿼리의 To(). – thomasb

답변

2

.Project()는 SQL을 생성하고 자연스럽게 매우 제한된 기능 만 이해하는 엔티티에 Linq를 사용합니다. 당신이

Mapper.Map<IEnumerable<Order>, IEnumerable<OrderDto>>(src) 

를 사용하는 경우

당신의 전환은 잘 작동합니다.

+0

변환은 잘 작동하지만'.Project()'의 모든 이점을 잃어 버리게됩니다. –

+0

이것을 열거 형에 어떻게 사용합니까? – thomasb

+0

Mapper.Map , IEnumerable > (src) – severin

관련 문제