我正在尝试使用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>
您可以看到,第一个模型是数据库中的关系模型-它具有一对多对多的关系,我想以用户为中心,并汇总所有角色之间的所有权限用户有权访问。
我设法从User-> UserRoles-> Roles中映射了Roles属性的UserDto,但是Permissions的聚合确实使我把头撞到桌子上(而且我不认为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();
如何将用户注册的所有角色之间的所有(唯一)权限汇总到该用户下的单个属性中?
谢谢
答案 0 :(得分:1)
考虑您的域结构为:
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();