AutoMapper on. Net Core 3.1 - PullRequest
       33

AutoMapper on. Net Core 3.1

0 голосов
/ 12 марта 2020

В приложении Net Core 3.1 я пытаюсь использовать AutoMapper.Extensions.Microsoft.DependencyInjection 7. В решении у меня есть 3 проекта:

  • Содержимое (стартовый проект)
  • Core
  • Entity Framework

После установки nuget, это мой код:

Startup.cs в Content Project:

using AutoMapper;
using Project.Content.EntityFrameWork;
using Project.Content.Dto;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace Project.Content
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();
            // Auto Mapper Configurations
            services.AddAutoMapper(typeof(AutoMapping));

            string connectionString = Configuration["ConnectionString:Default"];
            services.AddDbContext<ProjectContext>(options =>
        options.UseSqlServer(connectionString));
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseHttpsRedirection();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
    }
}

AutoMapping.cs в проекте Content:

using AutoMapper;
using Project.Content.Core.Domain.Model;

namespace Project.Content.Dto
{
    class AutoMapping : Profile
    {
        public AutoMapping()
        {
            CreateMap<Exercise, ExerciseDto>();
            CreateMap<ExerciseDto, Exercise>();
        }
    }
}

И это контроллер, на котором я пытаюсь отобразить:

using AutoMapper;
using Project.Content.EntityFrameWork;
using Project.Content.Dto;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;

namespace Project.Content.Controllers
{
    [ApiController]
    [Route("/exercise")]
    public class ExercisesController : ControllerBase
    {
        private readonly ILogger<ExercisesController> _logger;
        private ProjectContext _dbContext;
        private IMapper _mapper;

        public ExercisesController(ILogger<ExercisesController> logger, ProjectContext dbContext, IMapper mapper)
        {
            _logger = logger;
            _dbContext = dbContext;
            _mapper = mapper;
        }

        [HttpGet("{id}")]
        public ExerciseDto GetById(int id)
        {

            var exercise =  _mapper.Map<ExerciseDto>(_dbContext.Exercises.Where(x => x.Id == id));
            return exercise;
        }
    }
}

В этом контроллере, когда он пытается отобразить объекты он показывает ошибку:

AutoMapper.AutoMapperMappingException: отсутствует конфигурация карты типов или неподдерживаемое отображение.

Типы отображения: EntityQueryable 1 -> ExerciseDto Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable 1 [[Project.Content.Core.Domain. Model.Exercise, Project.Content.Core, Версия = 1.0.0.0, Культура = нейтральная, PublicKeyToken = null]] -> Project.Content.Dto.ExerciseDto в lambda_method (Закрытие, EntityQueryable`1, ExerciseDto, ResolutionContext) в lambda_method ( Закрытие, Объект, Объект, ResolutionContext) в Project.Content.Controllers.ExercisesController.GetById (Int32 id) в C: \ Projects \ Project \ Project.Content \ Project.Content.Service \ Controllers \ ExercisesController.cs: строка 44 в lambda_method (Closure, Object , Object []) в Microsoft.Extensions.Internal.ObjectMethodExecutor.Execute (объектная цель, параметры Object []) в Microsoft.AspNetCore. Mvc .Infrastructure.ActionMethodExecutor.SyncObjectResultExecutor.Execute (IActionResultTypeMetutorhopperd, IApperResultTypeMecutor Object [] arguments) в Microsoft.AspNetCore. Mvc .Infrastructure.ControllerActionInvoker.InvokeActionMethodAsyn c () в Microsoft.AspNetCore. Mvc .Infrastructure.ControllerActionInvoker.Next (состояние и следующее, область видимости и объема, объект и область действия, объект и область, объект и область видимости объекта, объекта ) в Microsoft.AspNetCore. Mvc .Infrastructure.ControllerActionInvoker.InvokeNextActionFilterAsyn c () --- Конец трассировки стека из предыдущего расположения, где было сгенерировано исключение --- в Microsoft.AspNetCore. Mvc .Infrastructure.ControllerActionInvoker.Rethrow (контекст ActionExecutedContextSealed) в Microsoft.AspNetCore. Mvc .Infrastructure.ControllerActionInvoker.Next (State & next, Scope & scope, Объект и состояние, логическое значение & isCompleted *) в Microsoft.AspNetIn.Core. InvokeInnerFilterAsyn c () --- Конец трассировки стека от предыдущего местоположения, в котором было сгенерировано исключение --- в Microsoft.AspNetCore. Mvc .Infrastructure.ResourceInvoker.g__Awaited | 19_0 (ResourceInvoker invoker, Task lastTask, State next, Scope) область действия, состояние объекта, логическое значение isCompleted) в Microsoft.AspNetCore. Mvc .Infrastructure.ResourceInvoker.g__Logged | 17_1 (активатор ResourceInvoker) в Microsoft.AspNetCore.Routing.EndpointMiddleware.g__AwaitRequestTask | 6_0 конечная точка запроса ILG, конечная точка запроса ILS, конечная точка запроса конечной точки (конечная точка) в Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke (контекст HttpContext) в Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke (контекст HttpContext)

1 Ответ

1 голос
/ 12 марта 2020

Вы пытаетесь отобразить IQueryable<T>, потому что он использует отложенное выполнение . Вам нужно выполнить запрос, используя что-то вроде ToList() или ToListAsync(), прежде чем пытаться отобразить его.

Вы также пытаетесь сопоставить коллекцию с одним элементом. Вместо этого вы должны сопоставить с коллекцией. Конечный результат выглядит примерно так запросить необходимые данные. Это может выглядеть примерно так Where. Кроме того, вы можете вернуть IActionResult для использования результатов базового контроллера, например NotFound или Ok.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...