【问题标题】:Do i need to create automapper createmap both ways?我需要双向创建自动映射器 createmap 吗?
【发布时间】:2011-09-05 07:34:00
【问题描述】:

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

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

1) 如果我打电话

CreateMap<ModelClass, ViewModelClass>()

那我还需要打电话吗

CreateMap<ViewModelClass, ModelClass>()

执行相反的操作?

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

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

【解决方案2】:

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

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

【讨论】:

  • 我知道这里不是提问的地方。通常我使用 AutoMapper 来启动一个带有 DTO 的实体对象,而 DTO 是我在客户端应用程序中使用的唯一模型。我的问题是关于从数据库中读取,在那个时候我有一个实体模型的集合,它应该启动 DTO 模型。我需要创建另一个反向映射吗?
  • @saber 是的。我的意思是这就是我正在做的事情,除非其他人证明相反。
  • 问题仍然存在,为什么我们必须打电话给CreateMap?强迫我手动指定映射并不适用于事物的整个“自动”部分......
【解决方案3】:

我使用了一种扩展方法来做双向映射

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

用法:

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

【讨论】:

  • 我认为这个扩展已经以.ReverseMap() 的形式存在,即CreateMap&lt;In,Out&gt;().ReverseMap(),如here 所见......正如我刚刚在the answer below 上注意到的那样
  • 我认为 ReverseMap 是在 2012 年 2 月之后添加的。
  • 也许,我只是在 2011 年 11 月的 the commit timestamp 前去
【解决方案4】:
  1. 可以,或者您可以致电CreateMap&lt;ModelClass, ViewModelClass&gt;().ReverseMap()
  2. 如果两个类具有相同的Member(Property,Field,GetMethod()),则无需调用CreateMap&lt;TSrc,TDest&gt;。实际上,如果TDest 中的每一个member 都存在于TSrc 中,则无需调用CreateMap&lt;TSrc,TDest&gt;。以下代码有效。
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" });

【讨论】:

    猜你喜欢
    • 2019-03-28
    • 2013-06-09
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多