Automapper将id列表映射到多对多场景中的对象

问题描述 投票:0回答:1

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

我的简化域模型(所有ID都由DB自动生成):

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对象。使用automapper实现这一目标的最佳方法是什么?我可以使用普通的C#映射它 - 但是我真的想知道使用Automapper执行此操作的正确方法。

c# automapper
1个回答
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执行此操作。

用法:

然后,您可以创建映射器的实例,最好在应用程序中只有一个mapper实例,因此在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

如果发现这个无用,你可以把它投下来,我会删除它,因为我希望读者不要对正确的做事方式感到困惑。

© www.soinside.com 2019 - 2024. All rights reserved.