我是否需要以两种方式创建automapper createmap?

时间:2011-05-31 08:44:11

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

这可能是一个愚蠢的问题! (n00b到AutoMapper和时间短!)

我想使用AutoMapper从EF4实体映射到ViewModel类。

1)如果我打电话

CreateMap<ModelClass, ViewModelClass>()

然后我还需要打电话

CreateMap<ViewModelClass, ModelClass>()

执行相反的操作?

2)如果两个类具有相同的属性名称,那么我是否需要一个CreateMap语句,或者这只是针对“特定/自定义”映射?

4 个答案:

答案 0 :(得分:105)

关于偶然发现这个问题的人的信息。现在似乎有一种通过在.ReverseMap()配置链的末尾添加CreateMap()调用来实现反向映射的内置方法。

答案 1 :(得分:14)

在AutoMapper中,您有一个Source类型和一个Destination类型。因此,只有拥有相应的CreateMap时,才能在此Source类型和Destination类型之间进行映射。所以回答你的问题:

  1. 您不需要定义反向映射。只有在打算回映时才需要这样做。
  2. 是的,您需要调用CreateMap来指示这些类型是可映射的,否则当您调用Map<TSource, TDest>告诉您源和目标类型之间不存在映射时,将抛出异常。

答案 2 :(得分:8)

我用扩展方法做两种方式的映射

    public static IMappingExpression<TDestination, TSource> BothWays<TSource, TDestination>
        (this IMappingExpression<TSource, TDestination> mappingExpression)
    {
        return Mapper.CreateMap<TDestination, TSource>();
    }

用法:

 CreateMap<Source, Dest>().BothWays();

答案 3 :(得分:0)

  1. 是,或者您可以致电CreateMap<ModelClass, ViewModelClass>().ReverseMap()
  2. 如果两个类具有相同的Member(属性,字段,GetMethod()),则无需调用CreateMap<TSrc,TDest>。实际上,如果member中的每个TDest都存在于TSrc中,则无需调用CreateMap<TSrc,TDest>。以下代码有效。
class Person
{
    public string Name { get; set; }
    public int Age { get; set; }  
}
class Person2
{
   public string Name { get; set; }
   public int? Age { get; set; }
   public DateTime BirthTime { get; set; }
}
public class NormalProfile : Profile
{
    public NormalProfile()
    {
       //CreateMap<Person2, Person>();//
    }
}
   
var cfg = new MapperConfiguration(c => 
{ 
    c.AddProfile<NormalProfile>();
});
//cfg.AssertConfigurationIsValid();
var mapper = cfg.CreateMapper();
var s3 = mapper.Map<Person>(new Person2 { Name = "Person2" });