AutoMapper使用linq映射嵌套属性
本文关键字:嵌套 属性 映射 linq 使用 AutoMapper | 更新日期: 2023-09-27 18:26:43
我需要映射父对象中嵌套对象的一个属性。假设我有users
,它有roles
,但角色有一个名为TransRoles
的转换对象,最后一个具有属性Description
,这就是我想要的。
DTO类
UsersDTO
标记:
public partial class UserDTO
{
public short Id { get; set; }
/* ... */
public virtual RolesDTO RolesDTO { get; set; }
}
RolesDTO
标记:
public class RolesDTO
{
public int Id { get; set; }
public string Description { get; set; } // Mapping destination
/* ... */
}
数据访问类
Users
标记:
public partial class User
{
public short Id { get; set; }
/* ... */
public virtual Roles Roles { get; set; }
}
Roles
标记:
public class Roles
{
public int Id { get; set; }
public virtual ICollection<TransRoles> TransRoles { get; set; }
// this class doesn't have the description
/* ... */
}
TransRoles
标记:
public class TransRoles
{
public int Id { get; set; }
public string Description { get; set; } // Mapping source
/* ... */
}
我有以下代码,但我想要的Users.Roles.TransRoles.Description
的描述没有加载到UsersDTO.RolesDTO.Description
:
Mapper.CreateMap<User, UserDTO>();
// Dependencies
Mapper.CreateMap<Roles, RolesDTO>()
.ForMember(dest => dest.Description, opt => opt.MapFrom(src => src.TransRoles.FirstOrDefault().Description));
如果我手动映射属性,它是有效的,但我认为如果我使用库映射器:
Mapper.CreateMap<User, UserDTO>();
Mapper.CreateMap<Roles, RolesDTO>();
// Manually mapping
UserDTO UserDTO = Mapper.Map<UserDTO>(User);
UserDTO.RolesDTO.Descripcion = User.Roles.TransRoles.FirstOrDefault().Description;
我必须找到主对象的所有内部引用,在我的示例中,RolesDTO
有不止一个子对象。此外,我目前正在使用Oracle11和EF6.0,这个版本不支持查询中的APPLY
,所以包括了不按预期工作的地方。
TLDR
映射对象时始终使用Mapper.AssertConfigurationIsValid();
,这样您就不会错过任何东西,如果您使用的是带有EF 6.0的Oracle 11,请小心。