【问题标题】:Automapper mapping a list of ids to objects in many-to-many scenarioAutomapper 将 id 列表映射到多对多场景中的对象
【发布时间】:2018-09-14 01:39:18
【问题描述】:

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

【问题讨论】:

    标签: c# automapper


    【解决方案1】:

    假设您已经安装了 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&lt;long&gt; 映射到 List&lt;OrderProduct&gt; 并且您也应该在您的个人资料中这样做。

    接下来,您配置一个 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();
            }
    

    如果觉得这没有帮助,你可以投反对票,我会删除它,因为我希望读者不要对正确的做事方式感到困惑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-16
      • 1970-01-01
      • 2020-01-29
      • 1970-01-01
      • 2021-04-28
      • 1970-01-01
      • 2012-09-17
      • 2019-04-26
      相关资源
      最近更新 更多