【问题标题】:Using Automapper to change Collection使用 Automapper 更改集合
【发布时间】:2018-11-17 06:21:29
【问题描述】:

我在 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();
        });
}

【问题讨论】:

  • 试试 AutoMapper.Collection。
  • 我无法满足 m\y 的需求。
  • 映射到现有集合时,首先清除目标集合。如果没有 AutoMapper.Collection,您将不得不忽略集合属性并自己映射它们。所以也许再试一次:)
  • 我不知道为什么 mapper.collection 从目标集合中删除所有记录并添加新记录。奇怪!
  • 你做错了。 AM.Collection 满足您的需求。

标签: c# automapper icollection


【解决方案1】:

为了回答我的问题和未来的读者,我使用 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();

如果有兴趣,请查看link

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 2020-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多