AutoMapper - сопоставить производный класс с Dto - PullRequest
0 голосов
/ 27 сентября 2018

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

public class LaunchConfiguration : Document
{
     public string Brand { get; set; }
     public string SettingName{ get; set; }
}

public class LaunchConfigurationDto
{
     public string Brand { get; set; }
     public string SettingName{ get; set; }
}

Цель dto - скрыть поля базового документа, когда он возвращается пользователю.Это моя конфигурация карты

public class DtoProfile : Profile
{
    public DtoProfile()
    {
        CreateMap<LaunchConfiguration,LaunchConfigurationDto>();
    }
};

Проблема, с которой я столкнулся, заключается в том, что auto mapper жалуется на свойства базового класса, которые не отображаются.«Не найденные участники были найдены».Свойства те, которые находятся в базовом классе.Я попытался указать это, чтобы игнорировать в профиле, но безрезультатно.Кто-нибудь может указать правильный способ сделать это?

Мой метод ConfigureServices, если кому-то интересно:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSwaggerGen(c =>
        {
            c.SwaggerDoc("v1", new Info { Title = Configuration["ApiInformation:Name"], Version = Configuration["ApiInformation:Version"] });
            c.DescribeAllEnumsAsStrings();
        });

        services.AddAutoMapper(mc =>
        {
            mc.AddProfile(new DtoProfile());
        });
         services.AddMvc().AddJsonOptions(options =>
        {
            options.SerializerSettings.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter());
            options.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;
        });
    }

Мой базовый класс:

 public class Document : IDocument, IDocument<Guid>
{

public Document()
{
  this.Id = Guid.NewGuid();
  this.AddedAtUtc = DateTime.UtcNow;
}

/// <summary>The Id of the document</summary>
[BsonId]
public Guid Id { get; set; }

/// <summary>The datetime in UTC at which the document was added.</summary>
public DateTime AddedAtUtc { get; set; }

/// <summary>The version of the schema of the document</summary>
public int Version { get; set; }
 }

Моя реализация где _mapperмой Введенный картограф и _repo Мой Введенный Репо.Исключение происходит на карте Вызов метода

 Task ILaunchConfigurationService<LaunchConfigurationDto >.InsertLaunchConfiguration(LaunchConfigurationDto model)
    {
         var mapped =  _mapper.Map<LaunchConfiguration >(model);
        return _repo.AddOneAsync(mapped);
    }

1 Ответ

0 голосов
/ 27 сентября 2018

Ваша проблема должна быть решена простым добавлением ReverseMap () к вызову CreateMap:

public class DtoProfile : Profile
{
    public DtoProfile()
    {
        CreateMap<LaunchConfiguration, LaunchConfigurationDto>().ReverseMap();
    }
};

Automapper по умолчанию создает одностороннюю карту.ReverseMap - просто сахар для создания обратной карты в случае, если нет никаких особых отображений в одном направлении.Вы также можете сделать это следующим образом:

public class DtoProfile : Profile
{
    public DtoProfile()
    {
        CreateMap<LaunchConfiguration, LaunchConfigurationDto>();
        CreateMap<LaunchConfigurationDto, LaunchConfiguration>();
    }
};

Подробнее об этом можно прочитать в документации

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

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