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
    列表中的对象映射到
    Parent.Children
    EntityCollection中具有匹配ID的对象
  • ParentViewModel.Children
    中为
    ParentViewModel.Children
    中的对象创建新对象,其中在目标列表中找不到具有源id的对象
  • 从源列表中不存在目标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));
        }
    }
    
    foreach(parentviewmodel.Children中的var childviewmodel)
    {
    如果(!parent.Children.Select(c=>c.Id).Contains(childviewmodel.Id))
    {
    parent.Children.Add(Mapper.Map(childviewmodel));
    }
    }
    
    其他行为的其他ifs

  • 一种方法是创建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>();
    
    Mapper.CreateMap()
    .BeforeMap();
    
    这样你就可以让automapper完成这项工作


您最终找到了如何实现这一点吗?感谢您的帮助,非常有用!然而,你所说的重新思考架构是什么意思,作为替代方案,你会提出什么建议?我的印象是,使用DTO是一个很好的实践,尤其是在管理RESTAPI之类的东西时。这绝对是,我不记得我是什么意思了。把它删掉,因为它没有多大意义。