简体   繁体   English

如何使用AutoMapper反向映射到现有的父对象?

[英]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. CustomerCustomerDto映射(和展平)很容易。 However, I'm having trouble reverse mapping from CustomerDto to Customer . 但是,我在从CustomerDtoCustomer反向映射方面遇到了麻烦。

AutoMapper is not able to figure out the Customer property in Address or Order . AutoMapper无法确定AddressOrderCustomer属性。 It also can't figure out the Address property in Order . 它也无法找出OrderAddress属性。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM