Automapper 仅在映射对象列表时覆盖不在源中的目标值
Automapper overrinding destination values that are not in source ONLY when mapping lists of objects
当尝试将源列表映射到目标列表时,自动映射器会覆盖 ID,因此它变为 00000000-0000-0000-0000-000000000000。
var configuration = new MapperConfiguration(cfg =>
{
cfg.CreateMap<Source, Destination>()
.ForMember(d => d.Name, opt => opt.MapFrom(dest => dest.Name))
.ForAllOtherMembers(opt => opt.Ignore());
});
var sourceList = new List<Source>
{
new Source
{
Name = "name1"
},
new Source
{
Name = "name2",
},
new Source
{
Name = "name3"
}
};
var destList = new List<Destination>
{
new Destination
{
Id = Guid.NewGuid()
},
new Destination
{
Id = Guid.NewGuid()
},
new Destination
{
Id = Guid.NewGuid()
}
};
var mapper = new Mapper(configuration);
var result = mapper.Map(sourceList, destList);
我也尝试过使用ValidateMemberList(MemberList.None)
,但效果是一样的。只有当对象在列表中时才会发生这种情况。两个对象之间的映射按预期工作。我是否缺少某些配置选项?
编辑:检查 visual studio 中的 make id 似乎是用新对象而不是映射值替换目标中的对象,是否有任何方法可以更改此行为或让它保留所有非映射属性来自初始目标对象?
这对我来说似乎不直观,但目前这是预期的行为,所以我决定单独迭代和映射每个项目。
for (var i = 0; i < sourceList.Count; i++)
{
var source = sourceList[i];
var destination= destList[i];
mapper.Map(source, destination);
}
对于我的用例,我认为不值得在 AutoMapper Collection 上添加一个新的依赖项,然后尝试以某种方式使其与索引一起工作。
当尝试将源列表映射到目标列表时,自动映射器会覆盖 ID,因此它变为 00000000-0000-0000-0000-000000000000。
var configuration = new MapperConfiguration(cfg =>
{
cfg.CreateMap<Source, Destination>()
.ForMember(d => d.Name, opt => opt.MapFrom(dest => dest.Name))
.ForAllOtherMembers(opt => opt.Ignore());
});
var sourceList = new List<Source>
{
new Source
{
Name = "name1"
},
new Source
{
Name = "name2",
},
new Source
{
Name = "name3"
}
};
var destList = new List<Destination>
{
new Destination
{
Id = Guid.NewGuid()
},
new Destination
{
Id = Guid.NewGuid()
},
new Destination
{
Id = Guid.NewGuid()
}
};
var mapper = new Mapper(configuration);
var result = mapper.Map(sourceList, destList);
我也尝试过使用ValidateMemberList(MemberList.None)
,但效果是一样的。只有当对象在列表中时才会发生这种情况。两个对象之间的映射按预期工作。我是否缺少某些配置选项?
编辑:检查 visual studio 中的 make id 似乎是用新对象而不是映射值替换目标中的对象,是否有任何方法可以更改此行为或让它保留所有非映射属性来自初始目标对象?
这对我来说似乎不直观,但目前这是预期的行为,所以我决定单独迭代和映射每个项目。
for (var i = 0; i < sourceList.Count; i++)
{
var source = sourceList[i];
var destination= destList[i];
mapper.Map(source, destination);
}
对于我的用例,我认为不值得在 AutoMapper Collection 上添加一个新的依赖项,然后尝试以某种方式使其与索引一起工作。