Использование Automapper для изменения коллекции - PullRequest
0 голосов
/ 17 ноября 2018

У меня есть две модели в C #, которые имеют отношение один ко многим:

public class Make
{
    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<Model> Models { get; set; }
}

public class Model
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Make Make { get; set; }
    public int MakeId { get; set; }
}

и DTO следующим образом:

public class MakeDto
{
    public int Id { get; set; }
    public int ModelId { get; set; }
    public ICollection<Models> Models { get; set; }
}

Я использую Automapper для отображения DTO воперация обновления, проблема заключается в том, что добавление / удаление коллекции работает нормально, но добавление новых элементов и обновление существующих элементов не работает.

public AutoMapperProfile()
{

    CreateMap<MakeDto, Make>()
        .ForMember(m => m.Id, opt => opt.Ignore())
        .ForMember(m => m.Model, opt => opt.Ignore())
        .AfterMap((dt, m) =>
        {

            // Remove Model
            var removedModel = m.Model.Where(x => !dt.Model.Any(f => f.Id == x.Id)).ToList();
            foreach (var m in removedModel)
                m.Model.Remove(m);

            // Add new Model
            var addedModel = dt.Model.Where(x => !m.Model.
            Any(f => f.Id == x.Id))
            .Select(x => new Model
            {
                Id = dt.Id,
                Name = x.Name
            })
            .ToList();            
            foreach (var m in addedModel)
                m.Model.Add(m);


        }).AfterMap((dt, m) =>
        {
            //Update Model
            m.Model = m.Model.Where(x => dt.Model.Any(f => f.Id == x.Id))
            .Select(x => new Model
            {
                Name = dt.Model.FirstOrDefault(x => x.Id == x.Id).Name,
            }).ToList();
        });
}

1 Ответ

0 голосов
/ 20 ноября 2018

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

        var mapper = new MapperConfiguration(
            cfg =>
            {
                cfg.AddCollectionMappers();
                cfg.CreateMap<MakeDto, Make>()
                    .EqualityComparison((src, dst) => src.Id == dst.Id);
                cfg.CreateMap<Model, Model>()
                    .ForMember(x => x.Make, opt => opt.Ignore())
                    .EqualityComparison((src, dst) => src.Id == dst.Id);
            })
            .CreateMapper();
        mapper.Map<MakeDto, Make>(makeDto, make);
        await _unitOfWork.CompleteAsync();

также, если интересно, смотрите эту ссылку

...