为什么我不能使用automapper将数据传输到视图模型中的嵌套属性?

时间:2018-04-07 05:43:41

标签: c# automapper asp.net-core-2.0

我正在尝试将我的数据从我的实体模型(PatientRegistry)传输到视图模型(PatientRegistryViewModel),而后者只有一个简单的嵌套属性(MobilePhoneNumberViewModel),我在实体模型和视图模型之间创建了一个映射,在模型实体和嵌套属性视图模型之间创建了另一个映射。在我的控制器中,我只是在实体模型和视图模型之间调用map!

我的映射器无法转移到嵌套属性!

实体模型

  public class PatientRegistry
    {
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        [Display(Name = "Record Id")]
        public long RecordId { get; set; }
        [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
        [Display(Name = "Patient File Number")]
        public long PatientFileId { get; set; }
        [Required, StringLength(50)]
        [Display(Name = "First Name")]
        public string FirstName { get; set; }
        public int CountryCodeId { get; set; }
        public Country CountryCode { get; set; }
        public int CellProvider { get; set; }
        [Required, StringLength(15)]
        public string PatientMobileNo { get; set; }
        [StringLength(20)]
        public string PatientLandLine { get; set; }
}

我的查看模型是,

public class PatientRegistryViewModel {

        public long PatientFileId { get; set; }

        [Required]
        [Display (Name = "First Name")]
        public string FirstName { get; set; }
        [Required]
        [Display (Name = "Last Name")]
        public string LastName { get; set; }
        public string AliasName { get; set; }

        [Required]
        [Display (Name = "Date of birth")]
        public DateTime PatientDob { get; set; }

        public MobilePhoneNumberViewModel PatientMobileNo { get; set; }
}

我的MobilePhoneNumberViewModel看起来像,

  public class MobilePhoneNumberViewModel {

        [Required]
        [Display (Name = "Country Code Id")]
        public int CountryCodeId { get; set; }

        [Required]
        [Display (Name = "Cell Provider")]
        public int CellProvider { get; set; }

        [Required]
        [Display (Name = "Mobile No")]
        public string PatientMobileNo { get; set; }
    }

我的地图是,

 CreateMap<PatientRegistry, PatientRegistryViewModel> ()
                .ForMember (pr => pr.GenderId, opt => opt.MapFrom (m => m.Gender.Id))
                .ForMember (pr => pr.StatusId, opt => opt.MapFrom (m => m.Status.Id))
                .ForMember (pr => pr.CountryId, opt => opt.MapFrom (m => m.Country.Id))
                .ForMember (pr => pr.StateId, opt => opt.MapFrom (m => m.State.Id))
                .ForMember (pr => pr.CityId, opt => opt.MapFrom (m => m.City.Id))
                .ForMember (pr => pr.NationalityId, opt => opt.MapFrom (m => m.Nationality.Id))
                .ForMember (pr => pr.OccupationId, opt => opt.MapFrom (m => m.Occupation.Id))
                .ForMember (pr => pr.MaritalStatusId, opt => opt.MapFrom (m => m.MaritalStatus.Id))
                .ForMember (dest => dest.PatientMobileNo.PatientMobileNo, opt => opt.MapFrom (src => src.PatientMobileNo))
                .ForMember (pr => pr.PatientMobileNo.CellProvider, opt => opt.MapFrom (m => m.CellProvider))
                .ForMember (pr => pr.PatientMobileNo.CountryCodeId, opt => opt.MapFrom (m => m.CountryCodeId))
                .ForMember (pr => pr.EthnicityId, opt => opt.MapFrom (m => m.Ethnicity.Id))
                .ForMember (pr => pr.Partners, opt => opt.MapFrom (m => m.Partners));
and

     CreateMap<PatientRegistry, MobilePhoneNumberViewModel> ()
                .ForMember (pr => pr.CountryCodeId, opt => opt.MapFrom (m => m.CountryCodeId))
                .ForMember (pr => pr.CellProvider, opt => opt.MapFrom (m => m.CellProvider))
                .ForMember (pr => pr.PatientMobileNo, opt => opt.MapFrom (m => m.PatientMobileNo));

(我缩短了这个问题的模型)

我一直收到这个错误,

  

未处理的异常:System.Reflection.TargetInvocationException:   调用的目标抛出了异常。 ---&GT;   System.ArgumentException:表达式'dest =&gt;   dest.PatientMobileNo.PatientMobileNo'必须解析为顶级成员   而不是任何子对象的属性。在上使用自定义解析器   改为子类型或AfterMap选项。

如果我删除

            .ForMember (dest => dest.PatientMobileNo.PatientMobileNo, opt => opt.MapFrom (src => src.PatientMobileNo))
            .ForMember (pr => pr.PatientMobileNo.CellProvider, opt => opt.MapFrom (m => m.CellProvider))
            .ForMember (pr => pr.PatientMobileNo.CountryCodeId, opt => opt.MapFrom (m => m.CountryCodeId))
AutoMapperMappingException: Error mapping types.
     

映射类型:PatientRegistry - &gt; PatientRegistryViewModel   ArtNgCore.Core.Models.ClinicCore.PatientRegistry - &gt;   ArtNgCore.Controllers.ViewModels.ClinicCoreViewModels.PatientRegistryViewModel

     

类型地图配置:PatientRegistry - &gt; PatientRegistryViewModel   ArtNgCore.Core.Models.ClinicCore.PatientRegistry - &gt;   ArtNgCore.Controllers.ViewModels.ClinicCoreViewModels.PatientRegistryViewModel

     

财产:PatientMobileNo

这是怎么回事?

1 个答案:

答案 0 :(得分:1)

如异常所示,您尝试从源对象属性映射到目标对象的属性属性。同时,没有为目标对象的属性本身PatientRegistryViewModel.PatientMobileNo定义映射。

PatientRegistry.PatientMobileNo → PatientRegistryViewModel.PatientMobileNo.PatientMobileNo 
PatientRegistry.CellProvider → PatientRegistryViewModel.PatientMobileNo.CellProvider
PatientRegistry.CountryCodeId → PatientRegistryViewModel.PatientMobileNo.CellProvider

您可以做的是定义从源对象到目标对象的另一个映射&#39;属性。

cfg.CreateMap<PatientRegistry, PatientRegistryViewModel>()
                .ForMember(dest => dest.PatientMobileNo,opt => opt.MapFrom(model => model));

cfg.CreateMap<PatientRegistry, MobilePhoneNumberViewModel>()
                .ForMember(dest => dest.PatientMobileNo, opt => opt.MapFrom(model => model.PatientMobileNo))
                .ForMember(dest => dest.CountryCodeId, opt => opt.MapFrom(model => model.CountryCodeId))
                .ForMember(dest => dest.CellProvider, opt => opt.MapFrom(model => model.CellProvider));