在DI实例上使用AutoMapper 8 Projectto



我正在使用AutoMapper.Extensions.Microsoft.DependencyInjection Nuget软件包中提供的AddAutoMapper方法将AutoMapper设置为ASP.NET Core 2.2 Web App。

在将单个实体映射到模型和返回时,它效果很好 - 我可以毫无问题地做到这一点:

mapper.Map<Model>(context.Set<Entity>().First());

,但我不知道如何使ProjectTo工作。我正在注射IMapper,并且已经尝试了这两种:

mapper.ProjectTo<Model>(context.Set<Entity>());

context.Set<Entity>().ProjectTo<Model>(mapper.ConfigurationProvider);

我遇到相同的错误:

System.ArgumentException: Static method requires null instance, non-static method requires non-null instance.
   at System.Linq.Expressions.Expression.ValidateStaticOrInstanceMethod(Expression instance, MethodInfo method)
   at System.Linq.Expressions.Expression.ValidateMethodAndGetParameters(Expression instance, MethodInfo method)
   at System.Linq.Expressions.Expression.Call(MethodInfo method, Expression arg0)
   at AutoMapper.QueryableExtensions.Impl.MemberGetterExpressionResultConverter.ExpressionResolutionResult(ExpressionResolutionResult expressionResolutionResult, MemberInfo getter) in C:projectsautomappersrcAutoMapperQueryableExtensionsImplMemberGetterExpressionResultConverter.cs:line 24
   at System.Linq.Enumerable.Aggregate[TSource,TAccumulate](IEnumerable`1 source, TAccumulate seed, Func`3 func)
   at AutoMapper.QueryableExtensions.ExpressionBuilder.ResolveExpression(PropertyMap propertyMap, Type currentType, Expression instanceParameter, LetPropertyMaps letPropertyMaps) in C:projectsautomappersrcAutoMapperQueryableExtensionsExpressionBuilder.cs:line 308
   at AutoMapper.QueryableExtensions.ExpressionBuilder.<>c__DisplayClass17_0.<CreateMemberBindings>g__CreateMemberBinding|0(PropertyMap propertyMap) in C:projectsautomappersrcAutoMapperQueryableExtensionsExpressionBuilder.cs:line 272
   at AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMemberBindings(ExpressionRequest request, TypeMap typeMap, Expression instanceParameter, IDictionary`2 typePairCount, LetPropertyMaps letPropertyMaps) in C:projectsautomappersrcAutoMapperQueryableExtensionsExpressionBuilder.cs:line 266
   at AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpressionCore(ExpressionRequest request, Expression instanceParameter, IDictionary`2 typePairCount, TypeMap typeMap, LetPropertyMaps letPropertyMaps) in C:projectsautomappersrcAutoMapperQueryableExtensionsExpressionBuilder.cs:line 204
   at AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest request, IDictionary`2 typePairCount, LetPropertyMaps letPropertyMaps) in C:projectsautomappersrcAutoMapperQueryableExtensionsExpressionBuilder.cs:line 152
   at System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode)
   at System.Lazy`1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor)
   at System.Lazy`1.CreateValue()
   at AutoMapper.QueryableExtensions.ExpressionBuilder.GetMapExpression(Type sourceType, Type destinationType, Object parameters, MemberInfo[] membersToExpand) in C:projectsautomappersrcAutoMapperQueryableExtensionsExpressionBuilder.cs:line 98
   at AutoMapper.QueryableExtensions.ProjectionExpression.To[TResult](Object parameters, Expression`1[] membersToExpand) in C:projectsautomappersrcAutoMapperQueryableExtensionsProjectionExpression.cs:line 60
   at AutoMapper.QueryableExtensions.Extensions.ProjectTo[TDestination](IQueryable source, IConfigurationProvider configuration, Expression`1[] membersToExpand) in C:projectsautomappersrcAutoMapperQueryableExtensionsExtensions.cs:line 76

我试图按照此处的文档中所述使用它:

  • 可查询扩展
  • 静态和实例API
  • 依赖注入

,但看起来我在静态与实例设置中做错了什么。我想使用我使用DI传递的IMapper实例,因为它在单个地图上工作正常。

我该怎么办才能解决此错误?

我找出了此错误的原因。感谢Lucian Bargaoanu提醒了有限的支持映射选项。我使用的是在源类型上以" get"前缀的方法进行扁平化,但我认为这与ProjectTo不起作用。(我认为属于列表中的最后一项 - 您域对象上的任何计算属性。)这就是为什么LINQ给出错误"非静态方法需要非null实例。" <<<<<<<<<</p>

不确定这是否会帮助任何人,但不要忘记检查您的反向映射是否也符合Automapper的支持选项。

我刚刚花了一个小时将我的头发撕开,试图解决这个问题。最后,我注意到/记住我在所有映射结束时都有ReverseMap(),这意味着当映射被逆转时违反了大量的源映射规则。

最新更新