Как правильно использовать Automapper в этой ситуации

Добрый день.
Мой вопрос в том, что у меня есть 2 метода редактирования в моем контроллере - получить и опубликовать.

        [HttpGet]
        public async Task<IActionResult> Edit(Guid id)
        {
            var article = await _articleService.GetArticleAsync(id);
            var resultModel = _mapper.Map<ArticleDetailViewModel>(article);


            return View(resultModel);
        }

        [HttpPost]
        public async Task<IActionResult> Edit(ArticleDetailViewModel model)
        {
            await _articleService.UpdateArticle(_mapper.Map<ArticleDTO>(model));

            return RedirectToAction("Index", "Article");
        }

Идентификатор Guid статьи входит в метод Edit get. С этим идентификатором я нахожу весь объект ArticleDTO и использую автосопоставление, чтобы превратить его в ArticleDetailViewModel. Далее я передаю эту модель в представление. В методе публикации Index изменения в статье редактируются и сохраняются с помощью метода UpdateArticle(ArticleDTO). В этом методе я должен вручную собрать одну сущность из 2-х сущностей и сохранить ее.

        public async Task UpdateArticle(ArticleDTO model)
        {
            var entity = await _unitOfWork.Articles.GetByIdAsync(model.Id);

            var articleResult = new Article()
            {
                Id = model.Id,
                Title = model.Title,
                Description = model.Description,
                Body = model.Body,
                CreationDate = model.CreationDate,
                PositivityGrade = entity.PositivityGrade,
                Comments = entity.Comments,
                Source = entity.Source,
                SourceId = entity.SourceId
            };

            _unitOfWork.Articles.Update(articleResult);
            await _unitOfWork.Comit();
        }

Подскажите пожалуйста, как этого избежать, и использовать Automapper, чтобы не делать это вручную. Или, может быть, есть какой-то другой способ.

вместо того, чтобы иметь переменную articleResult, почему бы просто не обновить соответствующие свойства переменной объекта и передать это методу Update(). Вы можете настроить AutoMapper для этого или сделать это вручную.

Scott Mildenberger 31.10.2022 16:16

@ScottMildenberger, к сожалению, проблема именно в этом. В контроллере получаю модель ArticleDetailViewModel с полями Id, Title, Description, Body, CreationDate в методе Edit post. Остальные поля пустые или по умолчанию. Поэтому мне приходится искать исходный объект в методе UpdateArticle (ArticleDTO) и вручную сопоставлять некоторые поля, которые я не меняю в форме.

itehnoviking 31.10.2022 16:54
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
2
122
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, это может быть то, что вы хотите:

public async Task UpdateArticle(ArticleDTO model)
{
    var entity = await _unitOfWork.Articles.GetByIdAsync(model.Id);
    
    var articleResult = _mapper.Map(model, entity)

    _unitOfWork.Articles.Update(articleResult);
    await _unitOfWork.Comit();
}

Другие вопросы по теме