Automapper 正在清除我的集合,尽管使用了“忽略”;为什么?

问题描述 投票:0回答:1

过去几天我一直在努力解决 Automapper 的奇怪行为。我的AutoMapper版本是10.1.1;目前我无法访问 .NET Standard 2.1,因此无法升级到 12.0.1。

涉及的类的关系如下所示:

//On the From side:

class FromA {
//   ...stuff...
     public FromB MemberB { get; set; }
//   ...stuff...
}

class FromB {
//   ...stuff...
}

//On the To side:

class ToA {
//   ...stuff...
     public ToB MemberB { get; set; }
//   ...stuff...
}

class ToB {
//   ...stuff...
    public ICollection<ToC> MemberC { get; set; }
//   ...stuff...
}

class ToC {
//  ...stuff...
}

然后在映射配置方面,我们有:

//I've got the following support member value resolver:

internal class TypeMappingMemberValueResolver<TSource, TDestination, TSourceMember, TDestinationMember>
        : IMemberValueResolver<TSource, TDestination, TSourceMember, TDestinationMember>
    {
        public TDestinationMember Resolve(TSource source, TDestination destination, TSourceMember sourceMember, TDestinationMember destMember, ResolutionContext context)
        {
            return context.Mapper.Map<TSourceMember, TDestinationMember>(sourceMember, destMember);
        }
    }

//Then, inside Profiles:

CreateMap<FromA, ToA>()
   ...
   .ForMember(to => to.MemberB, opt => opt.MapFrom(new TypeMappingMmeberValueResolver<FromA, ToA, FromB, ToB>(src => src.MemberB)
   ...

//Here, I'm just trying to be explicit that MemberB should be mapped according to another registered map. It might be possible to do this implicitly, but I'm uncertain how.
// Regardless, my remaining map:

CreateMap<FromB, ToB>()
   ...
   .ForMember(to => to.MemberC, opt => opt.Ignore())

鉴于此,当我执行时:

Mapper.Map<FromA, ToA>(instanceOfFromA, instanceOfToA);

instanceOfToA 的 MemberC 属性现在将设置为空数组。我在 FromB -> ToB 映射中还有许多其他被 Ignored() 的属性,并且这些属性都工作正常。

我的期望是,instanceOfA.MemberB.MemberC 不会受到影响,特别是不会被更改或删除其数据。

其他一些不应该成为因素的事情:

  • 我不使用任何全局或地图范围的地图设置,所有内容都使用 ForMember 在各个地图上进行管理。
  • 没有可能会搞砸事情的 BeforeMap 或 AfterMap 操作;事实上,ForMember 和 MapFrom 是唯一用于设置地图的函数。

我尝试了许多其他事情,并得到了一些发现:

  • 使用 .UseDestinationValue() 代替 .Ignore(),以及始终为 false 的前提条件;似乎没有什么实际上有任何效果,无论我多么努力地说不要碰它,集合总是被覆盖。我认为它必须是“正常”映射过程之外的东西。
  • 从 ICollection 更改为 ToC 可以使其工作 - 目标值被忽略/不变 - 因此,特别是 ICollection 的某些内容似乎是问题的根源。
  • 将虚拟 ToC 集合添加到 FromB,在映射之前使用 instanceOfToA.MemberB.MemberC 中的值填充它,并将 FromB.MemberC 的直接映射添加到 ToC.MemberC。单步执行表明该值最初确实是从虚拟副本设置的,但后来更新为空数组。
  • 空数组的更新发生在对从 B 更改为 ToB 的 TypeMappingMemberValueResolver 的调用之后,在 FromB -> ToB 的映射上指定的任何 AfterMap 操作之后,但在对 FromA -> ToA 的 AfterMap 调用之前如果我直接在instanceOfFromA.MemberB 上调用Map 到instanceOfToA.MemberB,则不会发生该问题。额外的间接层似乎是问题所在。它不会发生在 ValueResolver 中,这表明也不是这样。 我已经从源代码构建了自己的 Automapper 副本并将其连接起来,希望我可以逐步找出导致这种变化的原因,但地图的编译/生成性质已被证明是一个很大的障碍。
  • 我在这里有点不知所措,由于这种删除导致了关键的生产数据丢失,这并不是什么好事。我真的希望有一些我忽略的配置设置可能会阻止、修复或解决我所看到的行为。事实上,我想知道是否需要尝试强制升级到 .NET Standard 2.1 的问题,以便我可以尝试最新版本的 AutoMapper,祈祷这能解决问题。
  • 非常感谢!

我一直在努力解决集合被清除而不是映射的问题。这可能与

问题

中的场景有关。

该问题的公认答案
c# automapper automapper-10
1个回答
0
投票
AutoMapper.Collection

包以防止重新创建现有集合。

© www.soinside.com 2019 - 2024. All rights reserved.