Настройка AutoMapper в приложении .NET CORE 2.2 Web API

Я настроил AutoMapper «AutoMapper.Extensions.Microsoft.DependencyInjection Version 7.0» в моем приложении веб-API следующим образом; Я получаю сообщение об ошибке сопоставления конфигурации карты типов.

Запускать

  public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version
 public UserProfile()
    {
        CreateMap<User, UserDataView>()
            .ForMember(dest => dest.Id, opt => opt.MapFrom(dataModel => dataModel.Id))
            .ForMember(dest => dest.Title, opt => opt.MapFrom(dataModel => dataModel.Title))
            .ForMember(dest => dest.FirstName, opt => opt.MapFrom(dataModel => dataModel.FirstName))
            .ForMember(dest => dest.LastName, opt => opt.MapFrom(dataModel => dataModel.LastName))
            .ForMember(dest => dest.ActivationDate, opt => opt.MapFrom(dataModel => dataModel.ActivationDate));

        //CreateMap<User, UserDataView>()
        //    .ReverseMap();

    }
2); services.AddDbContext<SupplierContext>(options => options.UseInMemoryDatabase(databaseName: "MyDatabase")); services.AddTransient<IAppService, AppService>(); var profiles = from type in typeof(Startup).Assembly.GetTypes() where typeof(Profile).IsAssignableFrom(type) select (Profile)Activator.CreateInstance(type); var mapConfig = new MapperConfiguration(cfg => { foreach (var profile in profiles) { cfg.AddProfile(profile); } }); var mapper = mapConfig.CreateMapper(); services.AddSingleton(mapper); }

Я создал профиль в главном API проекта в папке

профиль

 public UserProfile()
    {
        CreateMap<User, UserDataView>()
            .ForMember(dest => dest.Id, opt => opt.MapFrom(dataModel => dataModel.Id))
            .ForMember(dest => dest.Title, opt => opt.MapFrom(dataModel => dataModel.Title))
            .ForMember(dest => dest.FirstName, opt => opt.MapFrom(dataModel => dataModel.FirstName))
            .ForMember(dest => dest.LastName, opt => opt.MapFrom(dataModel => dataModel.LastName))
            .ForMember(dest => dest.ActivationDate, opt => opt.MapFrom(dataModel => dataModel.ActivationDate));

        //CreateMap<User, UserDataView>()
        //    .ReverseMap();

    }

Класс пользователя

public class User
{
  
    public Guid Id { get; set; }

    public string Title { get; set; }

    public string FirstName { get; set; }

    public string LastName { get; set; }

    public DateTime ActivationDate { get; set; }

}

Когда я пытаюсь сопоставить данные модели с Dto, я получаю ошибку конфигурации отсутствующей карты типов.

Ошибка

Missing type map configuration or unsupported mapping.

 Mapping types:
 Task`1 -> List`1
 System.Threading.Tasks.Task`1[[System.Collections.Generic.List`1[[MyApp.Model.User.User, MyApp.Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea70000]] -> System.Collections.Generic.List`1[[MyApp.Model.DTOs.UserDataView, MyApp.Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]

Автоматическое сопоставление

 var UserDataModel = (from user in _context.Users
                   join email in _context.Emails on user.Id equals email.userId into se
                   join phone in _context.Phones on user.Id equals phone.userId into sp
                   select new User 
                   {
                       Id = user.Id,
                       Title = user.Title,
                       FirstName = user.FirstName,
                       LastName = user.LastName,
                       ActivationDate = user.ActivationDate,
                   }).ToListAsync();

var dataResult = _mapper.Map<List<UserDataView>>(UserDataModel);

person Toxic    schedule 01.11.2020    source источник


Ответы (1)


Я нашел свою ошибку. UserDataModel относится к типу Task ‹List›, где мой класс профиля ожидает другого.

Я изменил свой сценарий LINQ следующим образом, и он сработал

var UserDataModel = (from user in _context.Users
               join email in _context.Emails on user.Id equals email.userId into se
               join phone in _context.Phones on user.Id equals phone.userId into sp
               select new User 
               {
                   Id = user.Id,
                   Title = user.Title,
                   FirstName = user.FirstName,
                   LastName = user.LastName,
                   ActivationDate = user.ActivationDate,
               });

 var ddf = _mapper.Map<List<SupplierDataView>>(supplierDataModel);
person Toxic    schedule 01.11.2020
comment
docs.automapper.org/en/latest/Queryable-Extensions.html - person Lucian Bargaoanu; 02.11.2020