我正在尝试将我的数据从我的实体模型(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
这是怎么回事?
答案 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));