Automapper:如何将一个源映射到多个目标

问题描述 投票:0回答:2

我有以下示例实体:

public class User
{
    public string Username { get; set; }
    public string Password { get; set; }
    pubilc HashSet<UserRole> Roles { get; set; }
}

public class Role
{
    public string RoleName { get; set; }
    public HashSet<UserRole> Users { get; set; }
}

public class UserRole
{
    public int UserId { get; set; }
    public virtual User User { get; set; }
    public int RoleId { get; set; }
    public virtual Role Role { get; set; }
}

和以下Dtos:

public class UserModel
{
    public string Username { get; set; }
    public string Password { get; set; }
    pubilc HashSet<RoleModel> Roles { get; set; }
}

public class RoleModel
{
    public string RoleName { get; set; }
    public HashSet<UserModel> Users { get; set; }
}

具有以下AutoMapper配置:

CreateMap<User, UserModel>();

CreateMap<Role, RoleModel>();

CreateMap<UserRole, UserModel>()
    .ConstructUsing((src, ctx) => ctx.Mapper.Map<UserModel>(src.User));

CreateMap<UserRole, RoleModel>()
    .ConstructUsing((src, ctx) => ctx.Mapper.Map<RoleModel>(src.Role));

但是此配置使iis停止,没有任何错误!

此配置是否适合将一个源映射到多个目标?

Github test project

c# asp.net-core automapper
2个回答
1
投票

我不确定这是否是使用这种映射的好方法。但是问题在于映射中会发生无限循环(可能是嵌套映射)。

StackOverflowException

UserA

以下注释的代码是循环的来源:

Loop Source


0
投票

您可以尝试以下映射:

public MapperConfig()
    {
        CreateMap<User, UserModel>();

        CreateMap<UserRole, RoleModel>()
            .ForMember(des=>des.RoleName,opt=>opt.MapFrom(src=>src.Role.RoleName));

        CreateMap<Role, RoleModel>();
        CreateMap<UserRole, UserModel>()
            .ForMember(des => des.Username, opt => opt.MapFrom(src => src.User.Username))
            .ForMember(des => des.Password, opt => opt.MapFrom(src => src.User.Password));

    }
© www.soinside.com 2019 - 2024. All rights reserved.