繁体   English   中英

AutoMapper错误地映射名称为Type的属性-如何处理多个类

[英]AutoMapper incorrectly maps property with name Type - how to handle for multiple classes

在使用AutoMapper映射对象时,我们意识到,如果在类中有一个名为Type的属性,并且未定义任何显式映射,则AutoMapper会将该属性映射为源类型的Type name

为了演示,假设我有以下课程

public class SoldierDTO
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Category { get; set; }        
}

public class Officer
{
    public string Id { get; set; }
    public string Name { get; set; }
    public string BaseGroup { get; set; }
    public DateTime ActiveFrom { get; set; }
    public string Type { get; set; }
}

然后我定义了映射( Type没有映射)

Mapper.CreateMap<SoldierDTO, Officer>()
    .ForMember(dest => dest.BaseGroup, opt => opt.MapFrom(src => src.Category))
    .ForMember(dest => dest.ActiveFrom, opt => opt.UseValue(DateTime.Now));
    //.ForMember(dest => dest.Type, opt => opt.Ignore()); //this works though

让我们用它映射一个简单的士兵对象

var soldier = new SoldierDTO { Id = 11, Name = "Rackham", Category = "Gunner" };
var officer = Mapper.Map<Officer>(soldier); //Type = "Entities.SoldierDTO"

一切正常,除了为Type属性分配一个字符串值"Entities.SoldierDTO" ,它不过是源类型的全名! 我可以看到GitHub上存在一个已知问题 就像他们建议的那样,如果我在该属性上使用Ignore() ,则可以正常工作。

但是,我的一个项目中有很多具有Type属性的类。 是否有任何优雅的方式来处理所有这些类,而无需在所有单个映射上添加Ignore


编辑

我目前正在使用AutoMapper 3.3.1.0 如Yacoub的回答所述,此问题似乎已在版本4中得到解决。我需要一些时间来更新软件包,同时一些解决方法将很有帮助。

正如您在问题中指出的那样,这是一个已知问题,似乎已在更高版本中解决。 我已经在最新版本(4.0.4)中测试了您的代码,该问题已解决。

因此,您可能需要更新您的AutoMapper版本。

Mapper.CreateMap不是线程安全的。 这不是在多个地方使用它的好方法。

在App_start中创建一个静态类文件,然后在其中注册所有映射。 因此,它在应用程序上初始化。 另外,您无需在其他地方调用Mapper.CreateMap

public static class AutoMapperConfig
{

    public static void RegisterMappings()
    {
      Mapper.CreateMap<SoldierDTO, Officer>()
      .ForMember(dest => dest.BaseGroup, opt => opt.MapFrom(src => src.Category))
      .ForMember(dest => dest.ActiveFrom, opt => opt.UseValue(DateTime.Now));
      .ForMember(dest => dest.Type, opt => opt.Ignore());

    }
}

在global.asax.cs中

 protected void Application_Start()
 {
   AutoMapperConfig.RegisterMappings();
 }

您可以在线程安全的应用程序位置中使用Mapper.Map方法。

var soldier = new SoldierDTO { Id = 11, Name = "Rackham", Category = "Gunner" };
var officer = Mapper.Map<Officer>(soldier);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM