Как исправить Automapper, сопоставляющий соединительную таблицу с ViewModel - PullRequest
1 голос
/ 23 апреля 2019

Я использую AutoMapper 7.0.1 в проекте ASP CORE 2. Я пытаюсь сопоставить класс с таблицей соединений. Сопоставление сущности с моим видом модели работает. Когда я ReverseMap (), таблица соединения является нулевой и не отображается обратно на объект.

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

Я просмотрел документацию по AutoMapper, но я должен что-то упустить в конфигурациях CreateMap. Я пытался использовать ForMember, но безуспешно.

Я также пытаюсь понять процесс выравнивания и разглаживания в ReverseMap ()

    //Article.cs

    public class Article
    {
        public int ArticleId { get; set; }
        public string Title { get; set; }
        public virtual ICollection<ArticleGroup> ArticleGroups { get; set; } = new List<ArticleGroup>();
    }

    //Group.cs

    public class Group
    {
       public int GroupId { get; set; }
       public string GroupName { get; set; }
       public virtual ICollection<ArticleGroup> ArticleGroups { get; set; } = new List<ArticleGroup>();
    }

    //ArticleGroup.cs

    public class ArticleGroup
    {
       public int ArticleId { get; set; }
       public Article Article { get; set; }
       public int GroupId { get; set; }
       public Group Group { get; set; }
    }

    //ArticleFormView.cs

    public class ArticleFormView
    {
        public int ArticleId { get; set; }
        public string Title { get; set; }
        public virtual List<int> GroupIds { get; set; }
    }

    //Startup.cs
    ...

    AutoMapper.Mapper.Initialize(cfg =>
    {
       cfg.CreateMap<Article, ArticleFormView>()
          .ReverseMap()
       ;

       //Tried this as well removing ReverseMap() from above
       //cfg.CreateMap<ArticleFormView, Article>()
       //    .ForMember(a => a.ArticleGroups, opt =>
       //        opt.MapFrom(src =>
       //            src.GroupIds
       //        )
       //    )
       //;
    });

    ...
//View Component
@model ArticleFormView

<div class="form-group">
    <label asp-for="Title" class="col-xs-1 control-label"></label>
    <div class="col-xs-11">
        <span asp-validation-for="Title" class="text-danger"></span>
        <input asp-for="Title" class="form-control">
    </div>
</div>
<div class="form-group">
    <label asp-for="GroupIds" class="col-xs-1 control-label"></label>
    <div class="col-xs-2">
        <select multiple="multiple" asp-for="GroupIds" asp-items="ViewBag.ListOfGroups" name="GroupIds[]" style="display:none"></select>
    </div>
</div>

Как настроить AutoMapper, чтобы из списка int в ViewModel обратно в список ArticleGroup в объекте Article?

1 Ответ

1 голос
/ 23 апреля 2019

Я попытался воспроизвести ваш сценарий, и в результате я получил AutoMapperConfigurationException, сообщив, что несопоставленные члены найдены для свойства GroupIds ArticleFormView. Таким образом, я также написал карту из домена:

Mapper.Initialize(cfg =>
{
    cfg.CreateMap<Article, ArticleFormView>()
        .ForMember(articleFormView => articleFormView.GroupIds, opts =>
            opts.MapFrom(article => article.ArticleGroups.Select(articleGroup => articleGroup.GroupId)));

    cfg.CreateMap<ArticleFormView, Article>()
        .ForMember(article => article.ArticleGroups, opts =>
            opts.MapFrom(articleFormView => articleFormView.GroupIds.Select(id => new ArticleGroup
            {
                // Uncomment these two lines if you need them.
                //Article = new Article { Title = articleFormView.Title, ArticleId = articleFormView.ArticleId },
                //Group = new Group { GroupId = id },

                ArticleId = articleFormView.ArticleId,
                GroupId = id,
            })));
});

Имейте в виду, что, отображая сущность из статьи в представление формы, вы безвозвратно теряете данные. С предоставленной вам структурой представления формы есть ограничения относительно того, какие элементы вы можете заполнять при обращении к процессу отображения, просто потому, что у вас меньше данных для начала. Например, сохраняя только идентификаторы групп, вы теряете имена групп, поэтому при обратном отображении вы не будете знать имя группы.

ReverseMap() не сработало, потому что AutoMapper не будет автоматически знать, как обрабатывать две разные коллекции разных типов и имен:

  • Article: коллекция ArticleGroup, называемая "ArticleGroups"
  • ArticleFormView: список int, называемый "GroupIds"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...