代码之家  ›  专栏  ›  技术社区  ›  Adam Plocher

使用automapper从嵌套多层的列表映射/转换为父属性

  •  2
  • Adam Plocher  · 技术社区  · 6 年前

    我正在尝试使用automapper映射我的数据模型,如下所示:

    User
     -> UserRoles // list<UserRole> - has a prop for User and Role
      -> Role 
       -> RolePermissions // list<RolePermission> - has a prop for Role and Permission
        -> Permission
    

    对于一个简化模型,它是一个类似于下面这样的Web服务的DTO:

    UserDto
     -> Roles // List<RoleDto>
     -> Permissions // List<PermissionDto>
    

    正如您所看到的,第一个模型是来自数据库的关系模型——它有两个多对多关系级别,我希望以用户为中心,并聚合用户可以访问的所有角色的所有权限。

    我已经设法让userdto的roles属性从user->userroles->roles映射过来,但是权限的聚合确实让我头晕目眩(而且我不能认为是2个gud,所以我需要帮助)

    这是我映射到角色的代码,它似乎有效。

    CreateMap<RoleDto, UserRole>()
        .ForMember(x => x.Role, y => y.MapFrom(z => z))
        .ReverseMap();
    
    CreateMap<UserRole, RoleDto>()
        .ForMember(x => x.RoleId, y => y.MapFrom(z => z.Role.RoleId))
        .ForMember(x => x.Name, y => y.MapFrom(z => z.Role.Name))
        .ReverseMap();
    
    CreateMap<User, UserDto>() 
        .ForMember(x => x.Roles, y => y.MapFrom(z => z.UserRoles))
        // NOT SURE HOW TO MAP THIS NEXT LINE --->
        //.ForMember(x => x.Permissions, y => y.MapFrom(z => z.UserRoles)) 
        .ReverseMap();
    

    如何将用户注册到的所有角色的所有(唯一)权限聚合到用户下的单个属性中?

    谢谢你

    1 回复  |  直到 6 年前
        1
  •  1
  •   Maris    6 年前

    public class User {
        public List<UserRole> UserRoles { get; set; }
    }
    
    public class UserRole {
        public Role Role { get; set; }
    }
    
    public class Role {
        public List<RolePermission> RolePermissions { get; set; }
    }
    
    public class RolePermission {
        public Permission Permission { get; set; }
    }
    
    public class Permission {
        public string MyPermission { get; set; }
    }
    

    CreateMap<Permission, PermissionDto>
       // Do your mapping of permissions
       .ForMember(...)'
    
    CreateMap<User, UserDto>() 
        .ForMember(x => x.Roles, y => y.MapFrom(z => z.UserRoles))
        .ForMember(x => x.Permissions, y => y.MapFrom(z => z.UserRoles.Select(e=>e.Role).SelectMany(e=>e.RolePermissions).Select(e=>e.Permission).Distinct(e=>e.MyPermission))) 
        .ReverseMap();