我有以下课程。域模型由实体框架创建,我正在使用POCO。
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)
)
);
为了更新客户,我从数据库中检索它并使用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 :(得分: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:
// 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));