2015-09-07 11 views
6

Ho due classi mappate. La classe di origine ha una proprietà DateTime associata a una proprietà di destinazione di tipo long (DateTime.Ticks), rispettivamente UpdateDt e UpdateDtTicks.La proprietà di mappatura di Automapper in modo imprevisto dal nome della proprietà parziale corrisponde a

Quando utilizzo Automapper per mappare queste due classi, la proprietà UpdateDtTicks ottiene automaticamente il valore dalla proprietà UpdateDt, anche se i nomi di proprietà non sono gli stessi e non ho impostato esplicitamente il mapping per questa proprietà.

Automapper sta impostando la proprietà automaticamente perché i nomi delle proprietà si differenziano solo alla fine? In caso contrario, perché questo sta accadendo in quanto è un comportamento inaspettato.

prega di consultare il codice qui sotto:

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>();     
    } 
} 

Il risultato nella console:

enter image description here

e un orologio:

enter image description here

+0

La mia ipotesi è che automapper cerca 'MyDate' nell'oggetto di destinazione, trova' 'MyDate' con zecche 'postfix, e prova se' MyDate.Ticks' ha senso. In questo caso, questa è un'espressione completamente valida. Sto cercando questa funzionalità nella documentazione, ma sembra che stia succedendo. Hai provato a rinominarlo ad esempio in "MyDateTiicks'? – MarioDS

+0

Ho appena provato 'MyDateTiicks' e non viene mappato. Ho anche provato 'MyDatesTicks' e non viene mappato. Quindi sembra una combinazione del nome della proprietà e il fatto che 'Ticks' sono nel nome della proprietà. –

risposta

5

Stai innescando appiattimento del automapper caratteristica. Frome il documentation:

Quando si configura un tipo di coppia di origine/destinazione nel automapper, il configuratore tenta di far corrispondere le proprietà ei metodi per il tipo di sorgente di proprietà sul tipo di destinazione. Se per qualsiasi proprietà nel tipo di destinazione una proprietà, metodo o un metodo con prefisso "Get" non esiste nel tipo di origine, AutoMapper divide il nome del membro di destinazione in singole parole (mediante convenzioni PascalCase).

Così, dato il seguente esempio (dai loro documenti così, accorciati nella mia risposta):

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); 

La proprietà CustomerName abbinato alla proprietà Customer.Name su ordinazione.

questo è esattamente lo stesso di MyDateTicks corrispondenza MyDate.Ticks, che restituisce un long se necessario ...

+0

C'è un modo per disabilitare questa funzione durante la mappatura? – edmundpie

+0

@edmundpie Non sono riuscito a trovare un modo, ma forse puoi. C'è davvero una buona [documentazione] (https://automapper.readthedocs.io). Detto questo, AutoMapper brilla davvero di più quando non si tenta di combattere tutto il tempo. Prova a lavorare con le sue convenzioni e se un campo non ha bisogno di appiattimento, configura semplicemente una regola per quel campo.Potrebbe esserci un punto in cui scoprirai che la conversione manuale tra gli oggetti diventa più semplice rispetto al dover torcere e contortare un profilo di mappatura. – MarioDS

Problemi correlati