我有以下情况:
public class Parent : EntityObject
{
EntityCollection<Child> Children { get; set; }
}
public class Child : EntityObject
{
int Id { get; set; }
string Value1 { get; set; }
string Value2 { get; set; }
}
public class ParentViewModel
{
List<ChildViewModel> Children { get; set; }
}
public class ChildViewModel
{
int Id { get; set; }
string Value1 { get; set; }
string Value2 { get; set; }
}
Mapper.CreateMap<ParentViewModel, Parent>();
Mapper.CreateMap<ChildViewModel, Child>();
是否可以让 AutoMapper 执行以下操作:
- 将
ParentViewModel.Children
列表中的对象映射到具有匹配 ID 的Parent.Children
EntityCollection 中的对象。 - 在
Parent.Children
中为ParentViewModel.Children
中的对象创建新对象,其中在目标列表中找不到具有源 ID 的对象。 - 从源列表中不存在目标 ID 的
Parent.Children
中删除对象。
我是不是做错了?
最佳答案
恐怕 automapper 并不打算用于映射到已填充的对象,它会在您调用 Map() 时删除 Parent.Children。 这里有几种方法:
自己创建对 child 执行 map 的条件:
foreach (var childviewmodel in parentviewmodel.Children) { if (!parent.Children.Select(c => c.Id).Contains(childviewmodel.Id)) { parent.Children.Add(Mapper.Map<Child>(childviewmodel)); } }
为其他行为添加更多if()
创建一个 IMappingAction 并将其挂接到 BeforeMap 方法中:
class PreventOverridingOnSameIds : IMappingAction<ParentViewModel, Parent> { public void Process (ParentViewModel source, Parent destination) { var matching_ids = source.Children.Select(c => c.Id).Intersect(destination.Children.Select(d => d.Id)); foreach (var id in matching_ids) { source.Children = source.Children.Where(c => c.Id != id).ToList(); } } }
..及以后
Mapper.CreateMap<ParentViewModel, Parent>()
.BeforeMap<PreventOverridingOnSameIds>();
这样您就可以让自动映射器完成工作。
关于c# - AutoMapper 将源子列表中的对象映射到目标子实体集合中的现有对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4621481/