c# - AutoMapper:为没有映射的嵌套属性设置引用

标签 c# automapper

我想用 AutoMapper 映射 Order 类:

class Order
{
   public int Id { get; set; }
   public int Quantity { get; set; }
   public Product Product { get; set; }
}

产品类:

class Product
{ 
   public int Id { get; set; }
   public string Name { get; set; }
   public decimal Price { get; set; }
}

我已经为 Order 和 Product 类创建了 AutoMapper map 。在 Product 类中,我跳过了 Id 值。

问题是我想映射 Order.Product 作为引用。我可以通过这种方式实现它:

var order = new Order { Id = 1, Quantity = 5, Product = new Product { Id = 1, Name = "CPU", Price = 500 } };
var newOrder = Mapper.Map<Order, Order>(order);
newOrder.Product = order.Product; // I want to newOrder.Product reference point to the same object as order.Product

这种方法对我来说不合适,因为我必须手动设置 .Product 引用,我希望使用 AutoMapper 来完成。我不希望以“经典方式”映射嵌套的 Product 属性,我只需要在新对象中使用完全相同的引用。

我曾尝试使用 ResolveUsing 方法和 IMemberValueResolver 来解决这个问题,但没有成功,AutoMapper 仍然映射嵌套的 Product 属性,而不是将其引用设置为与其他 Order 对象中的引用相同。

最佳答案

首先你应该通过映射配置从初始映射中忽略 Product 属性,然后传递函数,这将设置 newOrderProduct 属性,进入 AfterMap 方法。

CreateMap<Order, Order>()
    .ForMember(dest => dest.Product, opt => opt.Ignore())
    .AfterMap((src, dest) =>
    {
        dest.Product = src.Product;
    });

映射:

var order = new Order { Id = 1, Quantity = 5, Product = new Product { Id = 1, Name = "CPU", Price = 500 } };
var newOrder = Mapper.Map<Order, Order>(order);

//Ouputs: true
Console.WriteLine(Object.ReferenceEquals(newOrder.Product, order.Product));

关于c# - AutoMapper:为没有映射的嵌套属性设置引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43029257/

相关文章:

c# WindowsIdentity 模拟不工作

c# - 如何使用 @Model (TimeSpan) 在 Razor 中使用三元运算符?

c# - 如何在 ClickOnce 中处理应用程序更新

c# - 如何在 ASP.NET MVC 中正确编码 MailTo 链接?

c# - Automapper 将多个属性映射到单个属性

asp.net-mvc - Automapper 空字符串为空

c# - 使用 Automapper 映射对象列表

c# - 尝试将 C# 函数移植到 PHP5

c# - 如何将 Automapper 配置为自动忽略具有 ReadOnly 属性的属性?

entity-framework - Automapper 和 Entity Framework