2017-01-09 11 views
0

У меня есть метод получить в Web API:AutoMapper ошибка проекции

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 к системе .Collections.Generic.List 1[CategoriesAndBrandsServices.Dtos.CategoryDto]. Create using Mapper.CreateMap<Category, List 1>. ", " exceptionType ":" System.InvalidOperationException ", " stackTrace ":" на AutoMa pper.QueryableExtensions.ExpressionBuilder.CreateMapExpression (запрос ExpressionRequest, экземпляр экземпляраParameter, IDictionary 2 typePairCount)\r\n at AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest request, IDictionary 2 typePairCount) \ r \ n в AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression (запрос ExpressionRequest) \ r \ n в AutoMapper.LockingConcurrentDictionary 2.<>c__DisplayClass2_1.<.ctor>b__1()\r\n at System.Lazy 1.CreateValue() \ r \ n в System.Lazy 1.LazyInitValue()\r\n at System.Lazy 1.get_Value() \ r \ n в AutoMapper.LockingConcurrentDictionary 2.GetOrAdd(TKey key)\r\n at AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(Type sourceType, Type destinationType, IDictionary 2 параметра, MemberInfo [] membersToExpand) \ r \ n в AutoMapper.QueryableExtensions.ProjectionExpression.To [TResult] (IDictionary 2 parameters, IEnumerable 1 memberPathsToExpand) \ r \ n в AutoMapper.QueryableExtensions.ProjectionExpression.To [TResult] (параметры объекта, выражение 1[] membersToExpand)\r\n at AutoMapper.QueryableExtensions.Extensions.ProjectTo[TDestination](IQueryable source, IConfigurationProvider configuration, Object parameters, Expression 1 [] membersToExpand) \ r \ n в AutoMapper.QueryableExtensions.Extensions.ProjectTo [TDestination] (IQueryable source, Expression 1[] membersToExpand)\r\n at CategoriesAndBrandsServices.Controllers.CategoriesController.<Get>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.TaskAwaiter 1. GetResult() \ r \ n в Sy stem.Threading.Tasks.TaskHelpersExtensions.d__3 1.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.TaskAwaiter 1.GetResult() \ r \ n в 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.TaskAwaiter 1.GetResult()\r\n at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>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.TaskAwaiter 1.GetResult() \ г \ п на System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()»

ответ

1

Я полагаю, что проект является один к одному, и вы пытаетесь отбрасывать из категории в список категорий dtos Так что попробуйте переделать проект с этим.

.ProjectTo<CategoryDto>() 

PS. Из исключения «Отсутствует карта из категорийAndBrandsServices.Models.Category в System.Collections.Generic.List1 [КатегорииAndBrandsServices.Dtos.CategoryDto]. Создайте с помощью Mapper.CreateMap."

+0

Это не сработает. Я уже пробовал. И у проекта есть от одного до многих отношений. Если вы проверите конфигурацию отображения для категорий, вы можете легко понять, что у нее есть отношения друг к другу. –

+0

Попробуйте, пожалуйста, сделать это еще раз и опубликовать исключение. –

+1

Я не вижу проблем с одним для многих, сейчас исключение говорит вам, что вы пытаетесь преобразовать категорию в список , поэтому, пожалуйста, попробуйте сделать то, что я написал, и опубликовать мне другое исключение, которое вы получаете. –