簡體   English   中英

使用自動映射器更改集合

[英]Using Automapper to change Collection

我在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,如下所示:

        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();

也有興趣的話,請看這個鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM