【问题标题】:In AutoMapper 8.0 missing ResolveUsing在 AutoMapper 8.0 中缺少 ResolveUsing
【发布时间】:2019-05-07 08:07:18
【问题描述】:

在 AutoMapper 8.0 之前,我使用过以下代码:

CreateMap<ApplicationRole, RoleViewModel>()
.ForMember(d => d.Permissions, map => map.MapFrom(s => s.Claims))
.ForMember(d => d.UsersCount, map => map.ResolveUsing(s => s.Users?.Count ?? 0))
                    .ReverseMap();

文档说您必须更改 MapFrom 的 ResolveUsing,但我有一个错误“没有传播 Null”

.ForMember(d => d.UsersCount, map => map.MapFrom(s => s.Users?.Count ?? 0))

我该如何解决?

【问题讨论】:

  • 确保您提供完整错误消息,包括任何堆栈跟踪(如果存在此类情况)。
  • 正如文档所说,您需要基于 Func 的重载,而不是基于表达式的重载。 docs.automapper.org/en/latest/…

标签: entity-framework asp.net-core automapper


【解决方案1】:

In AutoMapper 8.0 missing ResolveUsing

我也有同样的问题,我正在使用ResolveUsing 的以下原型:

void ResolveUsing(Func<TSource, TResult> mappingFunction);

我更喜欢创建扩展方法,而不是替换现有代码:

using System;
using AutoMapper;

namespace myLibrary.Extensions
{
    public static class AutoMapperCompatibilityExtensions
    {
        // Summary:
        //     Resolve destination member using a custom value resolver callback. Used instead
        //     of MapFrom when not simply redirecting a source member This method cannot be
        //     used in conjunction with LINQ query projection
        //
        // Parameters:
        //   resolver:
        //     Callback function to resolve against source type
        public static void ResolveUsing<TSource, TDestination, TMember, TResult>(this IMemberConfigurationExpression<TSource, TDestination, TMember> member, Func<TSource, TResult> resolver) => member.MapFrom((Func<TSource, TDestination, TResult>)((src, dest) => resolver(src)));
    }
}

后来,在我的代码中,我只是简单地引用了命名空间:

using myLibrary.Extensions;

...
    ... map.ResolveUsing(s =>  ...
...

希望这会有所帮助。

【讨论】:

  • 请原谅我,我能知道为什么我在这个答案上得到-1吗?谢谢。
  • 好吧,我只是给了你一个 +1,因为如果一个库不保持向后兼容性,那么你自己做是完全合理的。
  • 这拯救了我的一天
  • 好主意!
【解决方案2】:

您可以简单地删除 ResolveUsing(或 MapFrom),它将按照约定 Users.Count=>UsersCount 进行映射。

【讨论】:

    【解决方案3】:

    你不需要使用这个表达式,你可以“Users.Count”,如果列表为空,它会返回0。

    【讨论】:

      【解决方案4】:

      将 ResolveUsing 替换为 MapFrom,并在 lambda (Tdestination) 中再添加一个输入参数。

      .ForMember(d => d.UsersCount, map => map.MapFrom((s,d) => s.Users?.Count ?? 0))
      

      【讨论】:

        猜你喜欢
        • 2018-05-29
        • 1970-01-01
        • 1970-01-01
        • 2016-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-09
        • 1970-01-01
        相关资源
        最近更新 更多