C# 自动映射将源子列表中的对象映射到目标子实体集合中的现有对象
我有以下情况:C# 自动映射将源子列表中的对象映射到目标子实体集合中的现有对象,c#,entity-framework,automapper,C#,Entity Framework,Automapper,我有以下情况: 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 Pare
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>();
公共类父类:EntityObject
{
EntityCollection子项{get;set;}
}
公共类子对象:EntityObject
{
int Id{get;set;}
字符串值1{get;set;}
字符串值2{get;set;}
}
公共类ParentViewModel
{
列出子项{get;set;}
}
公共类ChildViewModel
{
int Id{get;set;}
字符串值1{get;set;}
字符串值2{get;set;}
}
CreateMap();
CreateMap();
是否可以将AutoMapper设置为:
- 将
列表中的对象映射到ParentViewModel.Children
EntityCollection中具有匹配ID的对象Parent.Children
- 在
中为ParentViewModel.Children
中的对象创建新对象,其中在目标列表中找不到具有源id的对象ParentViewModel.Children
- 从源列表中不存在目标id的父.Children中删除对象
我这样做完全错了吗?恐怕automapper不用于映射到已填充的对象,它会删除父对象。如果调用Map(),子对象将被删除。 这里有几种方法:
- 一是为自己创造条件,在孩子身上执行映射:
foreach (var childviewmodel in parentviewmodel.Children) { if (!parent.Children.Select(c => c.Id).Contains(childviewmodel.Id)) { parent.Children.Add(Mapper.Map<Child>(childviewmodel)); } }
其他行为的其他ifsforeach(parentviewmodel.Children中的var childviewmodel) { 如果(!parent.Children.Select(c=>c.Id).Contains(childviewmodel.Id)) { parent.Children.Add(Mapper.Map(childviewmodel)); } }
- 一种方法是创建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(); } } }
…后来class-preventionOverridingOnSameids:IMappingAction { 公共作废流程(ParentViewModel源、父目标) { var matchilds=source.Children.Select(c=>c.Id).Intersect(destination.Children.Select(d=>d.Id)); foreach(匹配_id中的变量id) { source.Children=source.Children.Where(c=>c.Id!=Id.ToList(); } } }
Mapper.CreateMap<ParentViewModel, Parent>() .BeforeMap<PreventOverridingOnSameIds>();
这样你就可以让automapper完成这项工作Mapper.CreateMap() .BeforeMap();