AutoMapper根据另一个属性

时间:2015-10-16 14:31:22

标签: c# automapper

我有这个场景

public class ObjectViewModel
{
    public int Isn { get; set; }
    public int? APO_Isn { get; set; }
    public string Name { get; set; }
}

public class ObjectModel
{
    public int Isn { get; set; }
    public int? APO_Isn { get; set; }
    public int? CLI_Isn { get; set; }
    public int? EMP_Isn { get; set; }
}
//Configuration of AutoMapper:  Mapper.CreateMap<ObjectViewModel, ObjectModel>().ReverseMap();

//On my controller:  var objectModel= Mapper.Map<ObjectModel>(objectViewModel);

假设objectViewModel的Isn属性等于53.当我基于objectViewModel映射objectModel时,由于某些我不知道的原因,AutoMapper在Isn中输入值53(没关系),但是也输入了CLI_Isn和EMP_Isn,我的ViewModel没有这些属性。

我做了一些测试,将CLI_Isn更改为Cli_Isn,将EMP_Isn更改为Emp_Isn,问题解决了。但是我仍然不明白导致问题的原因,这就是为什么53被移动到CLI_Isn和EMP_Isn。

2 个答案:

答案 0 :(得分:0)

您的word2是否可能包含对Mapper.InitializeRecognizeDestinationPrefixes("CLI_")的来电?这会使RecognizePrefixes("CLI_")忽略&#34; CLI _&#34;映射类型但不忽略&#34; Cli _&#34;。

答案 1 :(得分:0)

发生的事情是您正在触发AutoMapper Flattening feature

从该文件:

  

在AutoMapper中配置源/目标类型对时,配置程序会尝试将源类型上的属性和方法与目标类型上的属性进行匹配。如果目标上的任何属性键入属性,方法或前缀为&#34; Get&#34;在源类型中不存在,AutoMapper将目标成员名称拆分为单个单词(通过PascalCase约定)。

由于issue 402 was fixed这似乎也适用于下划线,这就是你在这里看到的。

似乎无法禁用展平,因此您必须明确排除这些属性:

Mapper.CreateMap<ObjectViewModel, ObjectModel>()
        .ForMember(dest => dest.CLI_Isn, src => src.Ignore())
        .ForMember(dest => dest.EMP_Isn, src => src.Ignore())
      .ReverseMap();