自动映射器将ID列表映射到多对多场景中的对象

时间:2018-09-14 01:39:19

标签: c# automapper

我正在寻找使用Automapper处理此问题的最佳方法

我的简化域模型(所有ID由数据库自动生成):

public class Product
{
    public long Id { get; set; }
    public List<OrderProduct> OrderProducts { get; set; }
}

public class Order
{
    public long Id { get; set; }
    public List<OrderProduct> OrderProducts { get; set; }
}

public class OrderProduct
{
    public long Id { get; set; }
    public long ProductId { get; set; }
    public long OrderId { get; set; }
    public Product Product { get; set; }
    public Order Order { get; set; }
}

我的DTO对象:

public class CreateOrderDTO
    {
        public long Id { get; set; }
        public List<long> ProductIds { get; set; }
    }

现在,我需要从CreateOrderDTO映射到Order对象。使用自动映射器实现此目标的最佳方法是什么?我可以使用普通的C#映射它-但是,我真的很想知道使用Automapper进行此操作的正确方法。

1 个答案:

答案 0 :(得分:0)

假设您已经安装了Automapper。

这是配置映射的一种方法。

您创建映射配置文件,应该从Profile对象继承,然后在配置文件的构造器中创建映射:

public class OrderProfile : Profile
    {
        public OrderProfile()
        {
            CreateMap<CreateOrderDTO, Order>().ForMember(c => c.OrderProducts, m => m.MapFrom(l => CreateOrderProducts(l.ProductIds)));
        }

        private static List<OrderProduct> CreateOrderProducts(IList<long> productIds)
        {
            IList<OrderProduct> orderProducts = new List<OrderProduct>();

            foreach (long id in productIds)
            {
                orderProducts.Add(new OrderProduct
                {
                    ProductId = id
                });
            }

            return orderProducts.ToList();
        }
    }

注意:我认为您需要手动将您的ProductIds List<long>映射到List<OrderProduct>,并且您也应该在个人资料中进行此操作。

接下来,您配置一个AutoMapper:

 public static class MappingConfig
    {
        public static MapperConfiguration Configure()
        {
            MapperConfiguration config = new MapperConfiguration(cfg =>
            {
                cfg.AddProfile<OrderProfile>();
            });

            return config;
        }
    }

这是通过MapperConfiguration的构造函数进行配置(即添加配置文件)的一种方法,您也可以使用静态Mapper实例http://docs.automapper.org/en/stable/Configuration.html进行此操作。

用法:

然后您可以创建一个映射器实例,最好是,您的应用程序中应该只包含一个映射器实例,因此将映射器注册到ioc容器中始终是一个好主意。

static void Main(string[] args)
        {
            var mapper = MappingConfig.Configure().CreateMapper();

            CreateOrderDTO dto = new CreateOrderDTO
            {
                Id = 1,
                ProductIds = new List<long> { 23L }
            };

            // Here it appears that it's as if you didn't do any manual mapping.
        Order order = mapper.Map<CreateOrderDTO, Order>(dto);
            Order order = mapper.Map<CreateOrderDTO, Order>(dto);

            Console.WriteLine("Order Id: " + order.Id);
        Console.WriteLine("Product Id: " + order.OrderProducts.Select(o => o.ProductId).First());
        Console.ReadLine();
        }

enter image description here

如果发现这没有帮助,可以将其否决,我将其删除,因为我希望读者不要对正确的做事方式感到困惑。