2012-10-26 3 views
4

J'ai les classes suivantes. Les modèles de domaine sont créés par framework d'entité et j'utilise POCO.Mappage d'objets complexes AutoMapper - mappage d'une liste

public class Customer 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public DateTime CreatedDate{ get; set; } 
    public DateTime ModifiedDate{ get; set; } 
    public virtual ICollection<Order> Orders{ get; set; } 
} 

public class CustomerDTO 
{ 

    public int Id { get; set; } 
    public string Name{ get; set; } 
    public List<OrderDTO> Orders{ get; set; } 
} 

public class Order 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int ProductId { get; set; } 
    public DateTime CreatedDate{ get; set; } 
    public DateTime ModifiedDate{ get; set; } 
} 

public class OrderDTO 
{ 
    public int Id { get; set; } 
    public string Name{ get; set; } 
} 

J'ai essayé les applications suivantes.

Mapper.CreateMap<Customer, CustomerDTO>(); 
Mapper.CreateMap<CustomerDTO, Customer>(); 
Mapper.CreateMap<Order, OrderDTO>(); 
Mapper.CreateMap<OrderDTO, Order>(); 

J'ai aussi essayé

Mapper.CreateMap<CustomerDTO, Customer>().ForMember(c => c.Orders, 
      m => m.MapFrom 
      (
       q => Mapper.Map<List<OrderDTO>, ICollection<Order>>(q.Orders) 
      ) 
     ); 

Afin de mettre à jour un client i le récupérer à partir de la base de données et mise à jour avec le customerDTO

Customer customer = _customerRepository.GetById(customerDTO.Id); 
Mapper.Map<CustomerDTO, Customer>(customerDTO, customer); 

L'objet client est mise à jour correctement et la date créée et modifiée ne sont pas modifiées. Mais chaque commande dans la liste des commandes n'est pas mise à jour correctement. Ses dates productId, created et modified sont définies sur la valeur par défaut et non sur les valeurs extraites de la base de données.

Est-ce que je dois faire autre chose parce que Orders est une collection virtuelle?

Je suis nouveau à mapper automatique toute aide appréciée.

EDIT

I ajouté

Mapper.AssertConfigurationIsValid(); 

reçu l'erreur suivante au démarrage de l'application: membres non mappées ont été trouvés. Passez en revue les types et les membres ci-dessous. Ajouter une expression de mappage personnalisé, ignorer, ajoutez un résolveur personnalisé, ou modifier le type de source/destination

Je mis à jour ma correspondance à:

Mapper.CreateMap<OrderDTO, Order>() 
       .ForMember(x => x.CreatedDate, y => y.Ignore()) 
       .ForMember(x => x.ModifiedDate, y => y.Ignore()) 
       .ForMember(x => x.ProductId, y => y.Ignore()) 

Mais l'ordre est d'avoir encore les propriétés ci-dessus écrasés par la par défaut vale

+0

Même problème!Faire le "Map" = la propriété "Id" et "UpdateDate" sera mis à la valeur par défaut au lieu de l'ignorer comme "CreateMap" défini ... Avez-vous trouvé une solution ?? – dataCore

Répondre

2

Je ne suis pas sûr que ce la bonne solution ou mieux, mais dans votre mapping vous pouvez essayer de changer

q => Mapper.Map<List<OrderDTO>, ICollection<Order>>(q.Orders) 

à

q => Mapper.Map<List<OrderDTO>, ICollection<Order>>(q.Orders, c.Orders) 

Cela devrait mettre à jour plutôt que de passer outre les commandes (similaires à votre carte client).

Notez qu'il devrait être suffisant pour simplement utiliser:

q => Mapper.Map(q.Orders, c.Orders) 

En plus:

également une petite chose, je trouve plus facile à lire les mises en correspondance lors de l'utilisation des conventions similaires à celles La documentation. For example:

// Configure AutoMapper 
Mapper.CreateMap<CalendarEvent, CalendarEventForm>() 
    .ForMember(dest => dest.EventDate, opt => opt.MapFrom(src => src.EventDate.Date)) 
    .ForMember(dest => dest.EventHour, opt => opt.MapFrom(src => src.EventDate.Hour)) 
    .ForMember(dest => dest.EventMinute, opt => opt.MapFrom(src => src.EventDate.Minute)); 
Questions connexes