2015-09-07 14 views
6

Mam dwie odwzorowane klasy. Klasa źródłowa ma właściwość DateTime, która jest mapowana do właściwości docelowej typu long (DateTime.Ticks), są to odpowiednio UpdateDt i UpdateDtTicks.Właściwość mapowania Automappera nieoczekiwanie według częściowej nazwy właściwości zgodnej z

Kiedy używam Automappera do odwzorowania tych dwóch klas, moja właściwość UpdateDtTicks automatycznie pobiera wartość z właściwości UpdateDt, mimo że nazwy właściwości nie są takie same i nie ustawiłem jawnie mapowania dla tej właściwości.

Czy Automapper ustawia właściwość automatycznie, ponieważ nazwy właściwości różnią się tylko na końcu? Jeśli nie, dlaczego tak się dzieje, ponieważ jest to nieoczekiwane zachowanie.

proszę zobaczyć poniższy kod:

static void Main(string[] args) 
{ 
    Configuration.Configure(); 

    var person = new OrderDto 
    { 
     OrderId = 999, 
     MyDate = new DateTime(2015, 1, 1, 4, 5, 6) 
    }; 

    var orderModel = Mapper.Map<OrderModel>(person); 

    Console.WriteLine(new DateTime(orderModel.MyDateTicks.Value)); 
    Console.ReadLine();   
} 

public class OrderDto 
{ 
    public int  OrderId { get; set; } 
    public DateTime MyDate { get; set; } 
} 

public class OrderModel 
{ 
    public int  OrderId  { get; set; } 
    public long? MyDateTicks { get; set; } 
} 

public class Configuration 
{ 
    public static void Configure() 
    { 
     Mapper.CreateMap<OrderDto, OrderModel>();     
    } 
} 

Wynik w konsoli:

enter image description here

i zegarka:

enter image description here

+0

Domyślam się, że automapper szuka 'MyDate' w obiekcie docelowym znajdzie' 'MyDate' z Kleszcze 'postfiks i próbuje, jeśli' MyDate.Ticks' ma sens. W tym przypadku jest to całkowicie poprawne wyrażenie. Szukam tej funkcji w dokumentacji, ale wydaje się, że to, co się dzieje. Czy próbowałeś zmienić jego nazwę, na przykład na 'MyDateTiicks'? – MarioDS

+0

Po prostu wypróbowałem 'MyDateTiicks' i nie został zmapowany. Próbowałem także 'MyDatesTicks' i również nie jest mapowany. Wygląda więc na połączenie nazwy właściwości i faktu, że 'Ticks' są w nazwie nieruchomości. –

Odpowiedz

5

Ty powodują spłaszczenie AutoMapper za cecha. Frome documentation:

Podczas konfigurowania typu parę źródłowy/docelowy w AutoMapper, konfigurator próbuje dopasować właściwości i metody typu źródła do właściwości na typ docelowy. Jeśli dla dowolnej właściwości typu docelowego właściwość, metoda lub metoda z prefiksem "Get" nie istnieje dla typu źródła, AutoMapper dzieli nazwę elementu docelowego na pojedyncze słowa (według konwencji PascalCase).

Tak więc, biorąc pod uwagę następujący przykład (z ich docs, jak również, w skróconych moją odpowiedź):

public class Order 
{ 
    public Customer Customer { get; set; } 
} 

public class Customer 
{ 
    public string Name { get; set; } 
} 

public class OrderDto 
{ 
    public string CustomerName { get; set; } 
    public decimal Total { get; set; } 
} 

Mapper.CreateMap<Order, OrderDto>(); 

var order = new Order 
{ 
    Customer = new Customer 
    { 
     Name = "John Doe" 
    } 
}; 

OrderDto dto = Mapper.Map<Order, OrderDto>(order); 

Obiekt CustomerName dopasowane do właściwości Customer.Name na zamówienie.

To jest dokładnie taka sama jak MyDateTicks dopasowanie MyDate.Ticks, która zwraca long jako niezbędny ...

+0

Czy jest jakiś sposób wyłączenia tej funkcji po mapowaniu? – edmundpie

+0

@edmundpie Nie mogłem znaleźć sposobu, ale może potrafisz. Jest naprawdę dobra [dokumentacja] (https://automapper.readthedocs.io). Powiedział, że AutoMapper naprawdę świeci najbardziej, gdy nie próbujesz walczyć z nim przez cały czas. Staraj się działać według konwencji, a jeśli jedno pole nie wymaga spłaszczenia, po prostu skonfiguruj regułę dla tego pola.Może się zdarzyć, że ręczna konwersja między obiektami stanie się łatwiejsza niż konieczność przekręcenia i wykreślenia profilu mapowania. – MarioDS

Powiązane problemy