AutoMapper使用linq映射嵌套属性

时间:2015-12-14 18:47:43

标签: c# linq mapping automapper

我需要在父级中映射嵌套对象的一个​​属性。 假设我usersroles,但角色有一个名为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;

1 个答案:

答案 0 :(得分:0)

我必须找到主要对象的所有内部引用,在我的示例中,Thymeleaf有更多的那个孩子。此外,我目前正在使用Oracle 11和EF 6.0,并且此版本不支持RolesDTO查询,因此包括不按预期方式工作的地方。

TLDR

在映射对象时始终使用APPLY,这样您就不会错过任何东西,如果您使用带有EF 6.0的Oracle 11,请小心。