我有一个课我需要映射到多个类,例如。
这是我从(视图模型)映射的源:
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>();
答案 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();
仅此而已!