Asp.net core 在DI实例上使用AutoMapper 8 ProjectTo

Asp.net core 在DI实例上使用AutoMapper 8 ProjectTo,asp.net-core,dependency-injection,automapper,Asp.net Core,Dependency Injection,Automapper,我正在使用AutoMapper.Extensions.Microsoft.DependencyInjectionNuGet包中提供的AddAutoMapper方法将AutoMapper安装到ASP.NET Core 2.2 web应用程序中 它在将单个实体映射到模型和模型时非常有效-我可以毫无问题地做到这一点: mapper.Map<Model>(context.Set<Entity>().First()); 及 context.Set().ProjectTo(mapp

我正在使用
AutoMapper.Extensions.Microsoft.DependencyInjection
NuGet包中提供的
AddAutoMapper
方法将AutoMapper安装到ASP.NET Core 2.2 web应用程序中

它在将单个实体映射到模型和模型时非常有效-我可以毫无问题地做到这一点:

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

context.Set().ProjectTo(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:\projects\automapper\src\AutoMapper\QueryableExtensions\Impl\MemberGetterExpressionResultConverter.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:\projects\automapper\src\AutoMapper\QueryableExtensions\ExpressionBuilder.cs:line 308
   at AutoMapper.QueryableExtensions.ExpressionBuilder.<>c__DisplayClass17_0.<CreateMemberBindings>g__CreateMemberBinding|0(PropertyMap propertyMap) in C:\projects\automapper\src\AutoMapper\QueryableExtensions\ExpressionBuilder.cs:line 272
   at AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMemberBindings(ExpressionRequest request, TypeMap typeMap, Expression instanceParameter, IDictionary`2 typePairCount, LetPropertyMaps letPropertyMaps) in C:\projects\automapper\src\AutoMapper\QueryableExtensions\ExpressionBuilder.cs:line 266
   at AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpressionCore(ExpressionRequest request, Expression instanceParameter, IDictionary`2 typePairCount, TypeMap typeMap, LetPropertyMaps letPropertyMaps) in C:\projects\automapper\src\AutoMapper\QueryableExtensions\ExpressionBuilder.cs:line 204
   at AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest request, IDictionary`2 typePairCount, LetPropertyMaps letPropertyMaps) in C:\projects\automapper\src\AutoMapper\QueryableExtensions\ExpressionBuilder.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:\projects\automapper\src\AutoMapper\QueryableExtensions\ExpressionBuilder.cs:line 98
   at AutoMapper.QueryableExtensions.ProjectionExpression.To[TResult](Object parameters, Expression`1[] membersToExpand) in C:\projects\automapper\src\AutoMapper\QueryableExtensions\ProjectionExpression.cs:line 60
   at AutoMapper.QueryableExtensions.Extensions.ProjectTo[TDestination](IQueryable source, IConfigurationProvider configuration, Expression`1[] membersToExpand) in C:\projects\automapper\src\AutoMapper\QueryableExtensions\Extensions.cs:line 76
System.ArgumentException:静态方法需要空实例,非静态方法需要非空实例。
位于System.Linq.Expressions.Expression.ValidateStaticOrInstanceMethod(表达式实例,MethodInfo方法)
位于System.Linq.Expressions.Expression.ValidateMethodAndGetParameters(表达式实例,MethodInfo方法)
在System.Linq.Expressions.Expression.Call(MethodInfo方法,表达式arg0)中
在C:\projects\AutoMapper\src\AutoMapper\QueryableExtensions\Impl.MemberGetterExpressionResultConverter.ExpressionResolutionResult(ExpressionResolutionResult ExpressionResult,MemberInfo getter)中的AutoMapper.QueryableExtensions.Impl.MemberGetterExpressionResultConverter.ExpressionResolutionResult(ExpressionResolutionResult,MemberInfo getter),第24行
at System.Linq.Enumerable.Aggregate[TSource,TAccumulate](IEnumerable`1 source,TAccumulate seed,Func`3 Func)
在C:\projects\AutoMapper\src\AutoMapper\QueryableExtensions\ExpressionBuilder.ResolveExpression(PropertyMap PropertyMap,Type currentType,Expression instanceParameter,LetPropertyMaps LetPropertyMaps)中的AutoMapper.QueryableExtensions.ExpressionBuilder.ResolveExpression(PropertyMap PropertyMap,Type currentType,Expression instanceParameter,LetPropertyMaps
在c:\projects\AutoMapper\src\AutoMapper\QueryableExtensions\ExpressionBuilder.c_u中显示Class17_0.g_uCreateMemberBinding | 0(PropertyMap PropertyMap PropertyMap):第272行
在C:\projects\AutoMapper\src\AutoMapper\QueryableExtensions\ExpressionBuilder.CreateMemberBindings(ExpressionRequest请求、TypeMap TypeMap、Expression instanceParameter、IDictionary`2 typePairCount、LetPropertyMaps LetPropertyMaps)中的C:\projects\AutoMapper\QueryableExtensions\ExpressionBuilder.cs:第266行
在C:\projects\AutoMapper\src\AutoMapper\QueryableExtensions\ExpressionBuilder.CreateMapExpressionCore(ExpressionRequest请求,Expression instanceParameter,IDictionary`2 typePairCount,TypeMap TypeMap,LetPropertyMaps LetPropertyMaps)的C:\projects\QueryableExtensions\ExpressionBuilder.cs:第204行
在C:\projects\AutoMapper\src\AutoMapper\QueryableExtensions\ExpressionBuilder.CreateMapExpression(ExpressionRequest请求,IDictionary`2 typePairCount,LetPropertyMaps LetPropertyMaps)中的AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression中:第152行
在System.Lazy`1.ViaFactory(LazyThreadSafetyMode模式)
位于System.Lazy`1.ExecutionAndPublication(LazyHelper ExecutionAndPublication,布尔useDefaultConstructor)
在System.Lazy`1.CreateValue()处
在C:\projects\AutoMapper\src\AutoMapper\QueryableExtensions\ExpressionBuilder.GetMapExpression(类型sourceType,类型destinationType,对象参数,MemberInfo[]membersToExpand)中的C:\projects\AutoMapper\src\AutoMapper\QueryableExtensions\ExpressionBuilder.cs:第98行
在C:\projects\AutoMapper\src\AutoMapper\QueryableExtensions\ProjectionExpression.cs中的AutoMapper.QueryableExtensions.ProjectionExpression.To[TResult](对象参数,表达式'1[]membersToExpand)处:第60行
在C:\projects\AutoMapper\src\AutoMapper\QueryableExtensions\Extensions.ProjectTo[tdestinition](IQueryable源代码,IConfigurationProvider配置,表达式'1[]membersToExpand)中的C:\projects\AutoMapper\QueryableExtensions\Extensions.cs:第76行
我正试图按照这里文档中的描述使用它:

但看起来我在静态与实例设置方面做错了什么。我想使用我与DI一起传递的
IMapper
实例,因为它可以在单个映射上正常工作


如何修复此错误?

我找到了此错误的原因。感谢您提醒我们有关有限公司的信息。我在源代码类型上使用了一个前缀为“Get”的方法,但我认为这不适用于
ProjectTo
。(我认为这属于列表中的最后一项-域对象上的任何计算属性),这就是为什么LINQ给出错误“非静态方法需要非空实例。”

不确定这是否对任何人都有帮助,但别忘了检查反向映射是否也符合AutoMapper支持的选项


我刚刚花了一个小时的时间反复尝试解决这个问题。最后,我注意到/记得我在所有映射的末尾都使用了
ReverseMap()
,这意味着在映射被反转时违反了大量源到目标的映射规则。

IMapper.ProjectTo
是您需要的。但你似乎发现了一个bug。重做会有帮助的。制定一个我们可以执行并看到失败的计划。但一定要确保你所要做的是ProjectTo。
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:\projects\automapper\src\AutoMapper\QueryableExtensions\Impl\MemberGetterExpressionResultConverter.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:\projects\automapper\src\AutoMapper\QueryableExtensions\ExpressionBuilder.cs:line 308
   at AutoMapper.QueryableExtensions.ExpressionBuilder.<>c__DisplayClass17_0.<CreateMemberBindings>g__CreateMemberBinding|0(PropertyMap propertyMap) in C:\projects\automapper\src\AutoMapper\QueryableExtensions\ExpressionBuilder.cs:line 272
   at AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMemberBindings(ExpressionRequest request, TypeMap typeMap, Expression instanceParameter, IDictionary`2 typePairCount, LetPropertyMaps letPropertyMaps) in C:\projects\automapper\src\AutoMapper\QueryableExtensions\ExpressionBuilder.cs:line 266
   at AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpressionCore(ExpressionRequest request, Expression instanceParameter, IDictionary`2 typePairCount, TypeMap typeMap, LetPropertyMaps letPropertyMaps) in C:\projects\automapper\src\AutoMapper\QueryableExtensions\ExpressionBuilder.cs:line 204
   at AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest request, IDictionary`2 typePairCount, LetPropertyMaps letPropertyMaps) in C:\projects\automapper\src\AutoMapper\QueryableExtensions\ExpressionBuilder.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:\projects\automapper\src\AutoMapper\QueryableExtensions\ExpressionBuilder.cs:line 98
   at AutoMapper.QueryableExtensions.ProjectionExpression.To[TResult](Object parameters, Expression`1[] membersToExpand) in C:\projects\automapper\src\AutoMapper\QueryableExtensions\ProjectionExpression.cs:line 60
   at AutoMapper.QueryableExtensions.Extensions.ProjectTo[TDestination](IQueryable source, IConfigurationProvider configuration, Expression`1[] membersToExpand) in C:\projects\automapper\src\AutoMapper\QueryableExtensions\Extensions.cs:line 76