asp.net – AutoMapper:将集合中的项目值从一个实例合并到另一个实例

我试图弄清楚如何使用AutoMapper合并两个复杂的对象实例.父对象具有一个属性,该属性是子对象的集合:
public class Parent
{
    public List<Child> Children { get; set; }
}

public class Child
{
    public string A { get; set; }
    public string B { get; set; }
    public string C { get; set; }
}

我有两个Parent实例:

var parentOne = new Parent()
{
    Children = new List<Child>() { new Child() { A = "A",B = "B",C = "C" } }
};

var parentTwo = new Parent()
{
    Children = new List<Child>() { new Child() { C = "Updated value" } }
};

我希望能够将parentOne中的值合并到parentTwo,而不会覆盖parentTwo中的C值.我创建的地图如下:

Mapper.CreateMap<Parent,Parent>()
    .ForMember(parent => parent.Children,opt => opt.UseDestinationValue());

Mapper.CreateMap<Child,Child>()
    .ForMember(child => child.C,opt => opt.Ignore());

Mapper.Map(parentOne,parentTwo);

据我了解,AutoMapper将创建复杂属性的新实例,除非您使用UseDestinationValue()选项.但是,执行上面的代码后,parentTwo.C等于“C”而不是“更新的值”.

在我看来,它保留了List< Child>的实例,但它在List中创建了Child的新实例.不幸的是,我正在努力想出一个能够保留Child的每个实例的地图.

任何帮助将非常感激!

解决方法

据我所知,AutoMapper不支持这一点,我相信这是因为支持这种情况的复杂性.

事实上,UseDestinationValue确实只对您推测的集合实例起作用 – 而不是集合元素.在您的场景中,每个列表中只有一个项目(我假设)您希望子项列表对象“同步”更新(即第一个元素更新第一个元素,第二个更新第二个等等).但是如果一个列表为3而另一个列表有5个呢?如果没有目标值,“UseDestinationValue”是什么意思?那么如何在两个子列表中选择要映射的desintation对象?在数据库场景中(听起来像是问题的基础),会有唯一的ID或某种外键,可以让你匹配子对象以知道映射到哪一个.在这种情况下,编写一个支持UseDestinationValue的通用映射对于集合的各个元素来说太难了(IMO).

相关文章

### 创建一个gRPC服务项目(grpc服务端)和一个 webapi项目(...
一、SiganlR 使用的协议类型 1.websocket即时通讯协议 2.Ser...
.Net 6 WebApi 项目 在Linux系统上 打包成Docker镜像,发布为...
一、 PD简介PowerDesigner 是一个集所有现代建模技术于一身的...
一、存储过程 存储过程就像数据库中运行的方法(函数) 优点:...
一、Ueditor的下载 1、百度编辑器下载地址:http://ueditor....