[英]How to reverse map to an existing parent object using AutoMapper?
Consider the following classes: 考虑以下类别:
public class Customer
{
public Guid Id { get; set; }
public List<Address> Addresses { get; set; }
public List<Order> Orders { get; set; }
}
public class Address
{
public Guid Id { get; set; }
public Customer Customer { get; set; } // parent
// ...
}
public class Order
{
public Guid Id { get; set; }
public Customer Customer { get; set; } // parent
public Address Address { get; set; }
// ...
}
And the data transfer objects (DTOs): 以及数据传输对象(DTO):
public class CustomerDto
{
public Guid Id { get; set; }
public AddressDto[] Addresses { get; set; }
public OrderDto[] Orders { get; set; }
}
public class AddressDto
{
public Guid Id { get; set; }
public Guid CustomerId { get; set; }
// ...
}
public class OrderDto
{
public Guid Id { get; set; }
public Guid CustomerId { get; set; }
public Guid AddressId { get; set; }
}
Mapping (and flattening) from Customer
to CustomerDto
is easy. 从Customer
到CustomerDto
映射(和展平)很容易。 However, I'm having trouble reverse mapping from CustomerDto
to Customer
. 但是,我在从CustomerDto
到Customer
反向映射方面遇到了麻烦。
AutoMapper is not able to figure out the Customer
property in Address
or Order
. AutoMapper无法确定Address
或Order
的Customer
属性。 It also can't figure out the Address
property in Order
. 它也无法找出Order
的Address
属性。
I can make it work by first "ignoring" these properties by using the Ignore
configuration method, and then using AfterMap
to manually find the objects and assign them appropriately. 我可以把它先“无视”这些属性通过使用工作Ignore
配置方法,然后用AfterMap
手动查找对象,并适当地进行分配。
Is there a way for AutoMapper to do this automatically? 有没有办法让AutoMapper自动执行此操作?
I think what you are looking for is .ReverseMap()
- http://docs.automapper.org/en/stable/Reverse-Mapping-and-Unflattening.html 我想你在找什么是.ReverseMap()
- http://docs.automapper.org/en/stable/Reverse-Mapping-and-Unflattening.html
So given the following mappings: 因此,给出以下映射:
var mapper = new MapperConfiguration(expression =>
{
expression.CreateMap<Customer, CustomerDto>()
.ForMember(dto => dto.Id, obj => obj.MapFrom(customer => customer.Id))
.ReverseMap();
expression.CreateMap<Address, AddressDto>()
.ForMember(dto => dto.Id, obj => obj.MapFrom(address => address.Id))
.ForMember(dto => dto.CustomerId, obj => obj.MapFrom(address => address.Customer.Id))
.ReverseMap();
expression.CreateMap<Order, OrderDto>()
.ForMember(dto => dto.Id, obj => obj.MapFrom(order => order.Id))
.ForMember(dto => dto.AddressId, obj => obj.MapFrom(order => order.Address.Id))
.ForMember(dto => dto.CustomerId, obj => obj.MapFrom(order => order.Customer.Id))
.ReverseMap();
}).CreateMapper();
And object: 和对象:
var customerTest = new Customer
{
Id = Guid.NewGuid(),
Addresses = new List<Address>
{
new Address
{
Id = Guid.NewGuid(),
Customer = new Customer{ Id = Guid.NewGuid() }
}
},
Orders = new List<Order>
{
new Order
{
Id = Guid.NewGuid(),
Customer = new Customer{ Id = Guid.NewGuid() },
Address = new Address{ Id = Guid.NewGuid() }
}
}
};
You could do the following: 您可以执行以下操作:
var resultDto = mapper.Map<CustomerDto>(customerTest);
var resultModel = mapper.Map<Customer>(resultDto);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.