Automapper отношения многие ко многим и добавление новых объектов - PullRequest
0 голосов
/ 04 октября 2018

У меня есть следующие модели, сопоставленные с EF Core:

    public class Choice
{
    public int Id { get; set; }
    public string Content { get; set; }
    public List<ChoicesQuestions> ChoicesQuestions { get; set; }
}

  public class ChoicesQuestions
{
    public int ChoiceId { get; set; }
    public Choice Choice { get; set; }
    public int QuestionId { get; set; }
    public Question Question { get; set; }
}

   public class Question
{
    public int Id { get; set; }
    public string Content { get; set; }
    public List<ChoicesQuestions> ChoicesQuestions { get; set; }
}

, а также ресурсы:

    public class ChoiceResource
{
    public int Id { get; set; }
    public string Content { get; set; }
}

    public class AddQuestionResource
{
    public int Id { get; set; }
    public string Content { get; set; }
    public List<ChoiceResource> Choices { get; set; }
}

У меня есть следующие сопоставления:

  CreateMap<ChoicesQuestions, ChoiceResource>()
            .ForMember(d => d.Id, opt => opt.MapFrom(c => c.ChoiceId))
            .ForMember(d => d.Content, opt => opt.MapFrom(c => c.Choice.Content));

   CreateMap<ChoiceResource, ChoicesQuestions>()
    .ForMember(d => d.ChoiceId, opt => opt.Ignore())
    .ForMember(d => d.Choice, opt => opt.Ignore())
    .AfterMap((o, c) =>
    {
        c.Choice = new Choice();
        c.Choice.Content = o.Content;
    });

       CreateMap<AddQuestionResource, Question>()
       .ForMember(o => o.ChoicesQuestions, opt => opt.MapFrom(x => x.Choices));

        CreateMap<Question, AddQuestionResource>();

Яиспользуя этот код в контроллере (отправка от клиента addQuestionResource):

  var question = _mapper.Map<Question>(addQuestionResource);

От клиента я отправляю Вопрос с выбором.Теперь код работает нормально, но проблема в том, что он постоянно добавляет новые объекты в мою базу данных, даже если они имеют одинаковое содержимое.Чего я хочу добиться, так это обнаружить, существует ли полученный выбор в базе данных, и если да -> не создавать новый, только добавить идентификатор существующего отношения ко многим ко многим.Я полагаю, что я должен каким-то образом использовать dbcontext в классе MappingProfile, но я не знаю, как правильно подходить к такого рода проблемам.Должен ли я использовать Automapper вообще для этого?

1 Ответ

0 голосов
/ 04 октября 2018

Так как я не мог попробовать решение, предложенное Lucian (Automapper.Collection), я попытался с другими подходами.Один из вариантов работы - реализация интерфейса ValueResolver:

    public class ChoiceResolver : IValueResolver<ChoiceResource, ChoicesQuestions, Choice>
{
    private readonly PollContext _pollContext;
    public ChoiceResolver(PollContext pollContext)
    {
        _pollContext = pollContext;
    }

    public Choice Resolve(ChoiceResource source, ChoicesQuestions destination, Choice destMember, ResolutionContext context)
    {
        var choice = _pollContext.Choices.SingleOrDefault(a => a.Content == source.Content);
        if (choice != null)
        {
            return choice;
        }
        else
        {
            var newChoice = new Choice();
            newChoice.Content = source.Content;
            return newChoice;
        }
    }
}

и мое отображение:

    CreateMap<ChoiceResource, ChoicesQuestions >()
            .ForMember(d => d.ChoiceId, opt => opt.Ignore())
            .ForMember(d => d.Choice, opt => opt.ResolveUsing<ChoiceResolver>());

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

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