【问题标题】:Automapper for a nested list with one item ignored忽略一项的嵌套列表的自动映射器
【发布时间】:2013-10-29 06:33:22
【问题描述】:

我有以下模型,用户模型有角色列表。

public class User
{
    public string Username { get; set; }
    public List<Role> Roles { get; set; }
}

public class Role
{
    public Guid RoleID { get; set; }
    public string Name { get; set; }
    public string Value { get; set; }
}


public class UserSourceModel
{
    public string Username { get; set; }
    public List<RoleSourceModel> Roles { get; set; }
}

public class RoleSourceModel
{
    public string Name { get; set; }
    public string Value { get; set; }
}

映射器:

 Mapper.CreateMap<UserSourceModel, User>();
            Mapper.CreateMap<RoleSourceModel, Role>()
                .ForMember(dest => dest.RoleID, opt => opt.Ignore());

我不希望 RoleID 从源映射,所以我提到了这个忽略并保留目标的值。

虚拟数据:

            //// data from UI
            UserSourceModel sourceData = new UserSourceModel
            {
                Username = "NewUser",
                Roles = new List<RoleSourceModel> { new RoleSourceModel { Name = "Admin", Value = "Admin" } }
            };

            //// data in database
            User destinationData = new User
            {
                Username = "UserInDB",
                Roles = new List<Role> { new Role { RoleID = Guid.NewGuid(), Name = "Staff", Value = "Staff" } }
            };

尝试映射:

var userOutPut = Mapper.Map<UserSourceModel, User>(sourceData, destinationData);

我希望 RoleID 应该是用户模型 (Guid.NewGuid()) 中已经存在的值,但我得到了空的 Guid (00000000-0000-0000-0000-000000000000)。

【问题讨论】:

    标签: c# automapper


    【解决方案1】:

    对我来说,使用 List 和 UseDestinationValue()

    Mapper.CreateMap<UserSourceModel, User>();
    Mapper.CreateMap<List<RoleSourceModel>, List<Role>>();
    Mapper.CreateMap<RoleSourceModel, Role>()
        .ForMember(dest => dest.RoleID, opt => opt.UseDestinationValue());
    

    【讨论】:

    • 不,这不起作用。现在 RoledId 正在从目的地获取,但名称和值没有被映射。这与 Gireesh cmets 相同
    【解决方案2】:

    我认为你需要再添加一张地图。

            Mapper.CreateMap<UserSourceModel, User>();         
            Mapper.CreateMap<List<RoleSourceModel>,List<Role>>();
         Mapper.CreateMap<RoleSourceModel, Role>()
             .ForMember(dest => dest.RoleID, o => o.Ignore());
    

    【讨论】:

    • 刚试过,但没有用。现在映射不适用于 RoleSourceModel 的名称和值属性。
    猜你喜欢
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多