【问题标题】:AutoMapper projection errorAutoMapper 投影错误
【发布时间】:2017-01-09 03:57:22
【问题描述】:

我在 web api 中有 get 方法:

public async Task<IHttpActionResult> Get()
{
   var categories = await _context.Categories.Include(x => x.SubCategories)
                                  .Where(c => c.IsActive)
                                  .ToListAsync();
   var outPut = AutoMapper.Mapper.Map<List<CategoryDto>>(categories);
   return Ok(outPut);
}

此方法按预期工作。但我不想从数据库中检索所有记录,然后映射到 DTO 并返回结果。我想使用 AutoMapper.QueryableExtensions 并只选择必填字段。

var categories = await _context.Categories.Include(x => x.SubCategories)
                                          .Where(c => c.IsActive)
                                          .ProjectTo<List<CategoryDto>>()
                                          .ToListAsync();

在映射配置中,我定义了如下映射:

public static void Config()
{
    AutoMapper.Mapper.Initialize(config =>
    {
        config.CreateMap<SubCategory, SubCategoryDto>();
        config.CreateMap<Category, CategoryDto>().ForMember(
                    des=>des.SubCategoriesCount,
                    opt=>opt.MapFrom(src=>src.SubCategories.Count));
    });

}

运行时出现以下异常

"exceptionMessage": "缺少从 CategoriesAndBrandsServices.Models.Category 到 System.Collections.Generic.List1[CategoriesAndBrandsServices.Dtos.CategoryDto]. Create using Mapper.CreateMap&lt;Category, List1> 的映射。", "exceptionType": "System.InvalidOperationException", "stackTrace": " 在 AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest request, Expression instanceParameter, IDictionary2 typePairCount)\r\n at AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest request, IDictionary2 typePairCount)\r\n 在 AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest request)\r\n 在 AutoMapper。 LockingConcurrentDictionary2.&lt;&gt;c__DisplayClass2_1.&lt;.ctor&gt;b__1()\r\n at System.Lazy1.CreateValue()\r\n 在 System.Lazy1.LazyInitValue()\r\n at System.Lazy1.get_Value()\r\n 在 AutoMapper.LockingConcurrentDictionary2.GetOrAdd(TKey key)\r\n at AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(Type sourceType, Type destinationType, IDictionary2 参数,MemberInfo[] membersToExpand)\r\n 在 AutoMapper .QueryableExtensions.ProjectionExpression.To[TResult](IDictionary2 parameters, IEnumerable1 memberPathsToExpand)\r\n at AutoMapper.QueryableExtensions.ProjectionExpression.To[TResult](对象参数,Expression1[] membersToExpand)\r\n at AutoMapper.QueryableExtensions.Extensions.ProjectTo[TDestination](IQueryable source, IConfigurationProvider configuration, Object parameters, Expression1[] membersToExpand)\r\n at AutoMapper.QueryableExtensions.Extensions.ProjectTo[Tdestination](IQueryable 源,Expression1[] membersToExpand)\r\n at CategoriesAndBrandsServices.Controllers.CategoriesController.&lt;Get&gt;d__0.MoveNext() in c:\\OnlineShoppingWebsite\\Services\\CategoriesAndBrandsServices\\CategoriesAndBrandsServices\\Controllers\\CategoriesController.cs:line 24\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter1.GetResult()\r\n at System.Threading.Tasks.TaskHelpersExtensions.d__31.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter1.GetResult()\r\n at System.Web.Http .Controllers.ApiControllerActionInvoker.d__0.MoveNext()\r\n--- 从先前引发异常的位置结束堆栈跟踪 ---\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)\ r\n 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)\r\n 在 System.Runtime.CompilerServices.TaskAwaiter1.GetResult()\r\n at System.Web.Http.Controllers.ActionFilterResult.&lt;ExecuteAsync&gt;d__2.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter1.GetResult()\r\n 在 System.Web.Http.Dispatcher。 HttpControllerDispatcher.d__1.MoveNext()"

【问题讨论】:

    标签: c# entity-framework-6 automapper-5


    【解决方案1】:

    我假设项目是一对一的,并且您尝试从类别转换到类别 dtos 列表 所以尝试用这个替换项目。

    .ProjectTo<CategoryDto>()
    

    PS。 从异常“缺少从 CategoriesAndBrandsServices.Models.Category 到 System.Collections.Generic.List1[CategoriesAndBrandsServices.Dtos.CategoryDto] 的映射。使用 Mapper.CreateMap 创建。”

    【讨论】:

    • 这行不通。我已经试过了。并且项目具有一对多的关系。如果您检查类别的映射配置,您可以很容易地找出它具有一对多的关系。
    • 请尝试再做一次,然后发布你得到的异常。
    • 我没有看到一对多的问题,现在异常告诉您您尝试将类别转换为列表,所以请尝试执行我写的内容并将您收到的其他异常发布给我.
    • 谢谢它的工作。我只需要清理并重建它开始工作的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-19
    • 1970-01-01
    相关资源
    最近更新 更多