2012-10-26 172 views
4

我有以下类。领域模型是由实体框架创建的,我使用POCO。AutoMapper复杂对象映射 - 映射列表

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

我曾尝试以下映射。

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

我也曾尝试

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

为了更新客户i从数据库中检索,并与customerDTO

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

客户对象更新它是正确更新和创建和修改日期不会更改。但订单列表中的每个订单都没有正确更新。它的productId,创建日期和修改日期被设置为默认值,而不是从数据库中检索的值。

因为Orders是一个虚拟集合,我还需要做些什么吗?

我是新来的自动映射的任何帮助赞赏。

编辑

我加

Mapper.AssertConfigurationIsValid(); 

在收到应用程序启动以下错误: 未映射成员被发现。查看下面的类型和成员。 添加自定义映射表达式,忽略,添加自定义解析,或修改源/目标类型

我更新我的映射:

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

但顺序仍具有上述特性由覆盖默认谷

+0

同样的问题!做“地图”=属性'Id'和'UpdateDate'将被设置为默认值,而不是将其忽略为定义的“CreateMap”... 您是否找到解决方案? – dataCore

回答

2

我不知道它的正确或最佳的解决方案,但在你的映射可以尝试更改

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

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

这应该更新而不是覆盖订单(类似客户的地图)。

注意,它也应该足以只需使用:

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

旁白:

另外一个次要的事情,我觉得它更容易使用类似的惯例那些在读取时的映射文档。 For example

​​