【问题标题】:Automapper override values which are not in sourceAutomapper 覆盖不在源中的值
【发布时间】:2021-09-14 02:19:39
【问题描述】:

您好,auomapper 有问题,我尝试使用 Automapper.Mapper(src, dest) 而不会在映射后丢失 dest 中的值。

我有一个类,其中包含如下对象列表

public class UpdateShipmentDetailDto
    {
        public bool IsDocument { get; set; }

        public List<UpdateItemDetailDto> ItemDetails { get; set; } = new();

    }

我想映射到哪个

public class SCS_OUT_Manifest
    {
        public Guid ManifestId { get; set; }
       

        public ICollection<SCS_OUT_ManifestItem> SCS_OUT_ManifestItems { get; set; } = new List<SCS_OUT_ManifestItem>();
    }

UpdateItemDetailDto 类如下所示

public class UpdateItemDetailDto
    {
        public Guid ItemId { get; set; }
        public string ItemDescription { get; set; }
        public int Qty { get; set; }
        public Guid UnitsId { get; set; }
        public decimal ItemValue { get; set; }
    }

SCS_OUT_ManifestItem 类看起来像

 public class SCS_OUT_ManifestItem
    {
        public Guid ItemId { get; set; }
        public Guid ManifestId { get; set; }
        public string ItemDescription { get; set; }
        public int Qty { get; set; }
        public Guid UnitsId { get; set; }
        public decimal ItemValue { get; set; }
}

我正在执行如下所示的映射,它从 ItemDetails(它是一个列表)映射到 SCS_OUT_ManifestItems(它也是一个 ICollection)。

 _mapper.Map(updateShipmentDetailDto.ItemDetails, manifest.SCS_OUT_ManifestItems);

映射完成后的问题,目标集合中的属性设置为默认值。

例如,SCS_OUT_ManifestItem 中的ManifestId manifest.SCS_OUT_ManifestItems 不在updateShipmentDetailDto.ItemDetails 中,它被设置为其默认的Guid00000000-0000-0000-0000-000000000000

但是如果我像下面这样在循环中运行它。

foreach (var item in manifest.SCS_OUT_ManifestItems)
            {

                _mapper.Map(updateShipmentDetailDto.ItemDetails.Single(s => s.ItemId == item.ItemId), item);

            }

请帮忙!提前致谢

【问题讨论】:

    标签: c# asp.net-core automapper


    【解决方案1】:

    尝试映射您的列表和您的项目,并在两个列表中使用相同的名称 ÏtemDetails。

    var config = new MapperConfiguration(cfg => 
    {
        cfg.CreateMap<UpdateItemDetailDto, SCS_OUT_ManifestItem>();
        cfg.CreateMap<UpdateShipmentDetailDto, SCS_OUT_Manifest>();
    });
    var _mapper = config.CreateMapper();
    
    var updateShipmentDetailDto = new UpdateShipmentDetailDto();
    var updateItemDetailDto = new UpdateItemDetailDto();
    var manifest = new SCS_OUT_Manifest();
    updateItemDetailDto.ItemId = Guid.NewGuid();
    updateItemDetailDto.UnitsId = Guid.NewGuid();
    manifest.ManifestId = Guid.NewGuid();
    
    updateItemDetailDto.ItemDescription = "test";
    updateItemDetailDto.Qty = 10;
    updateItemDetailDto.ItemValue = 25.50M;
    updateShipmentDetailDto.ItemDetails = new List<UpdateItemDetailDto>();
    updateShipmentDetailDto.ItemDetails.Add(updateItemDetailDto);
    
    _mapper.Map(updateShipmentDetailDto.ItemDetails, manifest.ItemDetails);
    
    Console.WriteLine($"DTO Guid: {updateShipmentDetailDto.ItemDetails[0].ItemId}, Desc: {updateShipmentDetailDto.ItemDetails[0].ItemDescription}");
    foreach (var item in manifest.ItemDetails)
    {
        Console.WriteLine($"Guid: {item.ItemId}, Desc: {item.ItemDescription}");   
    }
    Console.WriteLine($"Guid Manifest: {manifest.ManifestId}");
    

    【讨论】:

    • 情况并非如此。除了不在 src 中的属性被默认值替换之外,所有其他属性都正确映射。在这里更改属性名称没有意义
    • 我已经在 map 之前设置了 ManifestID,并且在调用 Map 之后打印它时它会保留 guid(现在我不更改属性名称,没有必要)
    • ItemId 和 UnitId 正在从源映射到目标。提供的答案会创建新对象。我的情况不是这样
    猜你喜欢
    • 2018-01-03
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 2016-08-11
    • 1970-01-01
    • 2023-02-06
    • 2018-05-06
    • 2021-12-05
    相关资源
    最近更新 更多