我正在使用AutoMapper ProjectTo将Person实体映射到EmployeeDto。在我的EmployeeDto中,我有一个单独的AddressDto属性需要捕获。因为Person有一个Address集合,所以我定义了我的映射来捕获第一个地址:
.ForMember(d => d.Address, s => s.MapFrom(m => m.Addresses.FirstOrDefault())
问题在于当我将其包含在我的映射中时,会收到一个错误,指定的类型成员“IsDeleted”不受支持... IsDeleted是Person上的基本属性,并带有属性[NotMapped]。我的EmployeeDto不包括IsDeleted属性。
当我查看IQueryable表达式属性时,我得到了这个:
System.Data.Entity.Core.Objects.ObjectQuery`1[MyProject.Data.Core.Entities.Person]
.MergeAs(MergeOption.AppendOnly)
.Where(
// Quoted to induce a closure:
a => a.FirstName.Contains(param.Value))
.Select(
// Quoted to induce a closure:
dto => new 0_Culture=neutral_PublicKeyToken=null>
{
IsDeleted = dto.IsDeleted,
UpdateDate = dto.UpdateDate,
CreateDate = dto.CreateDate,
Id = dto.Id,
…remaining Person entity properties removed for brevity,
Addresses = dto.Addresses,
Address = dto.Addresses.FirstOrDefault()
})
.Select(
// Quoted to induce a closure:
dto => new EmployeeDto
{
…all employeedto property removed for brevity,
Address = (dto.Address != null) ? new AddressDto { Id = dto.Address.Id } : null
})
以下是我的映射代码(ForSourceMember() 部分是我尝试的一种方法,但它无法解决问题 - 无论是否使用都会产生相同的结果):
configuration.CreateMap<Person, EmployeeDto>()
.ForSourceMember(s => s.IsDeleted, x => x.Ignore())
.ForSourceMember(s => s.CommonProperties, x => x.Ignore())
.ForSourceMember(s => s.Events, x => x.Ignore())
.ForMember(d => d.PersonId, s => s.MapFrom(m => m.Id))
.ForMember(d => d.PersonType, s => s.UseValue(PersonTypes.Employee))
.ForMember(d => d.StatusType, s => s.MapFrom(m => m.PersonStatusType.Type))
.ForMember(d => d.Status, s => s.MapFrom(m => m.PersonStatusType.Code))
.ForMember(d => d.Address, s => s.MapFrom(m => m.Addresses.FirstOrDefault()))
;
我地址(AddressDto)有一个类似的 CreateMap 定义,用于将 Address 映射到 AddressDto。
此外,当这些相同的对象是另一个DTO对象的子项时,映射起作用。希望这对某人能识别我的问题足够了。
编辑解决方法 - 添加条件将起作用。 由于某种原因,它会防止 IQueryable 表达式创建 .Select(dto => new 0_Culture=neutral_publickkeytoken=null> 块:
.ForMember(d => d.Address, s => s.MapFrom(m => m.Addresses.Count > 0 ? m.Addresses.FirstOrDefault() : null)