Automapper映射到嵌套类

时间:2011-10-28 01:15:41

标签: asp.net-mvc automapper

我有一个课我需要映射到多个类,例如。

这是我从(视图模型)映射的源:

public class UserBM
{
    public int UserId { get; set; }

    public string Address { get; set; }
    public string Address2 { get; set; }
    public string Address3 { get; set; }
    public string State { get; set; }

    public int CountryId { get; set; }
    public string Country { get; set; }
}

目的地类是这样的(域模型):

public abstract class User
{
    public int UserId { get; set; }

    public virtual Location Location { get; set; }
    public virtual int? LocationId { get; set; }
}

public class Location
{
    public int LocationId { get; set; }

    public string Address { get; set; }
    public string Address2 { get; set; }
    public string Address3 { get; set; }
    public string State { get; set; }

    public virtual int CountryId { get; set; }
    public virtual Country Country { get; set; }

}

这就是我的automapper创建地图当前的样子:

Mapper.CreateMap<UserBM, User>();

3 个答案:

答案 0 :(得分:26)

定义两个映射,从相同的源映射到不同的目标。在User映射中,使用Location

手动映射Mapper.Map<UserBM, Location>(...)属性
Mapper.CreateMap<UserBM, Location>();
Mapper.CreateMap<UserBM, User>()
    .ForMember(dest => dest.Location, opt => 
         opt.MapFrom(src => Mapper.Map<UserBM, Location>(src));

答案 1 :(得分:1)

我正在使用Automapper 9,上面的答案对我不起作用。 然后使用.afterMap来解决您的问题,例如:

public class AutoMapperUser : Profile
{
        public AutoMapperUser ()
        {
            CreateMap<UserBM, User>()
                .AfterMap((src, dest, context) => dest.Location = context.Mapper.Map<UserBM, Location>(src));
        }
    }
}

我希望能帮助别人。

答案 2 :(得分:0)

我有另一个解决方案。主要思想是 AutoMapper know如何在拼合对象中正确命名属性时如何拼合嵌套对象:添加嵌套对象属性名称作为前缀。对于您的情况, Location 是前缀:

public class UserBM
{
    public int UserId { get; set; }

    public int LocationId { get; set; }
    public string LocationAddress { get; set; }
    public string LocationState { get; set; }
    public string LocationCountry { get; set; }
    ...
}

因此创建从嵌套到展平的熟悉的映射,然后然后使用ReverseMap方法使AutomMapper了解如何展平嵌套的对象

CreateMap<UserBM, User>()
   .ReverseMap();

仅此而已!