gpt4 book ai didi

AutoMapper 复杂对象映射 - 映射列表

转载 作者:行者123 更新时间:2023-12-01 04:01:45 24 4
gpt4 key购买 nike

我有以下类(class)。域模型由 Entity Framework 创建,我正在使用 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())

但是订单仍然具有被默认值覆盖的上述属性

最佳答案

我不确定它是正确的还是最好的解决方案,但是在您的映射中,您可以尝试更改

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



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

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

请注意,仅使用以下内容也应该足够了:

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

关于AutoMapper 复杂对象映射 - 映射列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13084665/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com