2015-09-07 20 views
6

Eşleştirilen iki sınıf var. Kaynak sınıfı, long (DateTime.Ticks) türünde bir hedef özelliğine eşlenen DateTime özelliğine sahiptir, bunlar sırasıyla UpdateDt ve UpdateDtTicks'dur. Automapper eşleme özelliği beklenmedik şekilde kısmi özellik adı eşleşmesi eşleşmesi

Ben Automapper özellik adları aynı değildir ve açıkça bu özellik için eşleme ayarlanmış yapmamış olsanız bile, benim UpdateDtTicks özellik otomatik UpdateDt özelliğinden değerini alır, bu iki sınıfları eşleştirmek için kullanın

.

Otomatik eşleyici, özellik adlarının yalnızca özellik sonundan farklı olması nedeniyle otomatik olarak ayarlanıyor mu? Değilse neden bu beklenmedik davranış olarak oluyor.

bakınız aşağıda kodu:

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

konsolunda sonucu:

enter image description here

Ve bir saat:

enter image description here

+0

Benim tahminim o automapper hedef nesnesi MyDate' 'arar aynı ... Bir long gerektiğinde döner MyDate.Ticks, eşleştirme MyDateTicks olarak,' Keneler ile 'MyDate' bulur Postfix ve MyDate.Ticks 'mantıklı eğer çalışır. Bu durumda, bu tamamen geçerli bir ifadedir. Dokümantasyonda bu özelliği arıyorum ama bu neler oluyor gibi görünüyor. Örneğin, 'MyDateTiicks' için yeniden adlandırmayı denediniz mi? – MarioDS

+0

Sadece MyDateTiicks'i denedim ve haritalanmadı. Ayrıca MyDatesTicks'i denedim ve aynı zamanda haritalanmadı. Yani özellik isminin bir kombinasyonu gibi görünüyor ve 'Ticks' özelliği adı. –

cevap

5

Sen AutoMapper en düzleşme tetikleyen özellik. Frome documentation: Eğer AutoMapper bir kaynak/hedef türü çifti yapılandırırken

, yapılandırıcı hedef türüne özelliklerine kaynak türüne özelliklerini ve yöntemlerini eşleştirmeye çalışır. Hedef türündeki herhangi bir özellik için "Get" ile öneklenen bir özellik, yöntem veya bir yöntem kaynak türünde mevcut değilse, AutoMapper hedef üye adını tek tek sözcüklere (PascalCase kuralı) olarak ayırır.

Böylece (aynı zamanda, benim cevap kısaltılmış kendi dokümanlardan) aşağıdaki örneği verilen: Sipariş Customer.Name özelliğine eşleşti

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

MüşteriAdı özelliği. Tam olarak

Bu edilir

+0

Eşleme ile bu özelliği devre dışı bırakmanın bir yolu var mı? – edmundpie

+0

@edmundpie Bir yol bulamadım, ama belki yapabilirsin. Gerçekten iyi belgeler var (https://automapper.readthedocs.io). Bu, AutoMapper'ın her zaman, her zaman savaşmaya çalışmadığınızda en çok parladığı anlamına geliyor. Kendi sözleşmeleriyle çalışmayı deneyin ve bir alanın düzleşmeye ihtiyacı yoksa, o alan için bir kural yapılandırmanız yeterlidir.Nesneler arasında manuel olarak dönüştürme yapmanın, bir eşleme profilini bükmek ve çarpıtmaktan daha kolay olduğunu bulacağınız bir nokta olabilir. – MarioDS

İlgili konular