Automapper使用createmap展平

时间:2011-10-28 16:09:06

标签: asp.net-mvc asp.net-mvc-3 automapper

我需要将多个类映射到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网站上的文档,这应该是自动的,但它不起作用。 AddressAddress2等仍然为空。我的createmap应该是什么样的?

4 个答案:

答案 0 :(得分:0)

编辑奇怪这个问题已被你问过..似乎是一个同样的问题 - 我想我错过了一些东西......

选中此SQ Question

*

  

定义两个映射,从相同的源映射到不同的映射   目的地

*

答案 1 :(得分:0)

我认为您需要在LocationAddress上使属性名称与LocationAddress2UserBM类似,以便自动投影起作用,但我可能错了。

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更加层次化,以匹配目的地层次。