我需要将多个类映射到1个类中:
这是我从(视图模型)映射的源:
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>();
基于automapper codeplex网站上的文档,这应该是自动的,但它不起作用。 Address
,Address2
等仍然为空。我的createmap应该是什么样的?
答案 0 :(得分:0)
答案 1 :(得分:0)
我认为您需要在LocationAddress
上使属性名称与LocationAddress2
和UserBM
类似,以便自动投影起作用,但我可能错了。
在Flattening上查看他们的页面,他们的属性名称包含了我所指示的源连接属性名称。
答案 2 :(得分:0)
只需遵循目标类中的命名约定,并使用Location
为地址属性添加前缀,因为这是源类中的属性名称:
public class UserBM
{
public int UserId { get; set; }
public string LocationAddress { get; set; }
public string LocationAddress2 { get; set; }
public string LocationAddress3 { get; set; }
public string LocationState { get; set; }
public int CountryId { get; set; }
public string Country { get; set; }
}
答案 3 :(得分:0)
原因是因为AutoMapper无法按惯例将所有这些平面字段映射到Location
对象。
您需要自定义解析器。
Mapper.CreateMap<UserBM, User>()
.ForMember(dest => dest.Location, opt => opt.ResolveUsing<LocationResolver>());
public class LocationResolver : ValueResolver<UserBM,Location>
{
protected override Location ResolveCore(UserBMsource)
{
// construct your object here.
}
}
然而,我不喜欢这个。 IMO,更好的方法是将ViewModel中的这些属性封装到嵌套的视图模型中:
public class UserBM
{
public int UserId { get; set; }
public LocationViewModel Location { get; set; }
}
然后你要做的就是定义一个额外的地图:
Mapper.CreateMap<User, UserBM>();
Mapper.CreateMap<LocationViewModel,Location>();
然后一切都会奏效。
您应尽可能尝试使用AutoMapper约定。并且可以使您的ViewModel更加层次化,以匹配目的地层次。