亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 Entity Framework Core 中將字典轉換為 ICollection

在 Entity Framework Core 中將字典轉換為 ICollection

C#
守著星空守著你 2022-12-24 13:37:41
在這里,我對EF Core中的dictionaryto轉換感到困惑。Icollection我Dictionary在FlatEmployee課堂上將鍵值對列表存儲在數據庫中。我這樣聲明:public class FlatEmployee{    public int EmployeeId { get; set; }    public Dictionary<string, long> PayAndAllowances { get; set; }}//====================Configuration public void Configure(EntityTypeBuilder<FlatEmployee> builder){        builder.HasKey(f => new { f.EmployeeId });        builder.Property(sb => sb.PayAndAllowances)            .HasConversion(                pa => JsonConvert.SerializeObject(pa),                pa => JsonConvert.DeserializeObject<Dictionary<string, long>>(pa));}當我播種或插入時,這絕對沒問題。但是我在嘗試獲取 FlatEmployee 類時遇到的問題。這是因為我想獲取 Collection 中的字典。為此,我聲明了另一個這樣的類:public class LastPayCertificateViewModel: IHaveCustomMapping{    public int EmployeeCode { get; set; }    public EmployeeEarningDTO PayAndAllowances { get; set; }    public void CreateMappings(Profile configuration)    {        configuration.CreateMap<FlatEmployee, LastPayCertificateViewModel>()            .ForMember(dto => dto.EmployeeCode , opt => opt.MapFrom(entity => entity.EmployeeId ));    }}public class EmployeeEarningDTO : IHaveCustomMapping{    public ICollection<BaseEmployeeDictionary> PayAndAllowances { get; set; }    public void CreateMappings(Profile configuration)    {        configuration.CreateMap<FlatEmployee, EmployeeEarningDTO>()            .ForMember(dto => dto.PayAndAllowances, opt => opt.MapFrom(entity => entity.PayAndAllowances));    }}public class BaseEmployeeDictionary{    public string Name { get; set; }    public long Amount { get; set; }}當我嘗試使用上面的類來獲取這樣的數據時:public class LastPayCertificateQuery : IRequest<LastPayCertificateViewModel>{    public string EmployeeCode { get; set; }}
查看完整描述

1 回答

?
UYOU

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



查看完整回答
反對 回復 2022-12-24
  • 1 回答
  • 0 關注
  • 167 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號