c# - 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 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/

相关文章:

entity-framework - Entity Framework : create one-to-one relation to itself

entity-framework - 如何 POST/PATCH 到 Azure 移动服务上的多对多关系实体?

c# - 立即将窗体上的所有控件设置为只读

c# - Entity Framework Core 多对多导航问题

c# - 未能从文本 'Path' 创建 '(RadButtonOnImage:RadButtonImage.Image)'

c# - 无法使用独立关联将可选外键设置为空

c# - Automapper - RecognizePrefixes 不起作用

c# - 如何让 Unity 解析 AutoMapper 在映射时创建的模型?

c# - 我只看到项目模板 blazorserver,为什么我看不到项目模板 blazor、blazorhosted、blazorlib、blazorserverside?

c# - 无法获得碰撞或触发器来处理 2 个 2D 对象