1 回答

TA貢獻1878條經驗 獲得超4個贊
原來是AutoMapper映射問題。
首先,與以下相比,EmployeeEarningDTO內部創建了額外的級別:LastPayCertificateViewModelFlatEmployee
LastPayCertificateViewModel.PayPayAndAllowances.PayAndAllowances
對比
FlatEmployee.PayAndAllowances
AutoMapper 默認映射具有相同名稱的屬性。所以在FlatEmployeemap內部LastPayCertificateViewModel它會嘗試映射Dictionary<string, long> PayAndAllowances到EmployeeEarningDTO PayAndAllowances. 但是沒有從Dictionary<string, long>到的映射EmployeeEarningDTO。相反,有一個從FlatEmployee到的映射EmployeeEarningDTO,所以你必須告訴 AM 使用它:
configuration.CreateMap<FlatEmployee, LastPayCertificateViewModel>()
.ForMember(dto => dto.EmployeeCode, opt => opt.MapFrom(entity => entity.EmployeeId))
.ForMember(dto => dto.PayAndAllowances, opt => opt.MapFrom(entity => entity)); // <--
其次,映射 from FlatEmployeeto EmployeeEarningDTO- AM 會自動嘗試映射PayAndAllowances屬性,但是沒有映射 from KeyValuePair<string, long>to BaseEmployeeDictionary。你可以定義這樣的映射
configuration.CreateMap<KeyValuePair<string, long>, BaseEmployeeDictionary>()
.ForMember(dst => dst.Name, opt => opt.MapFrom(src => src.Key))
.ForMember(dst => dst.Amount, opt => opt.MapFrom(src => src.Value));
這將使您可以簡單地使用
configuration.CreateMap<FlatEmployee, EmployeeEarningDTO>();
但是您可能不會這樣做,因為您不希望每個都 KeyValuePair<string, long>映射到BaseEmployeeDictionary,因此您可以就地進行映射:
configuration.CreateMap<FlatEmployee, EmployeeEarningDTO>()
.ForMember(dto => dto.PayAndAllowances, opt => opt.MapFrom(entity => entity.PayAndAllowances
.Select(src => new BaseEmployeeDictionary { Name = src.Key, Amount = src.Value })));
- 1 回答
- 0 關注
- 167 瀏覽
添加回答
舉報