AutoMapper-将派生类映射到Dto

时间:2018-09-27 11:53:09

标签: c# asp.net-core automapper

我正在尝试将继承自基类的类映射到dto。

public class LaunchConfiguration : Document
{
     public string Brand { get; set; }
     public string SettingName{ get; set; }
}

public class LaunchConfigurationDto
{
     public string Brand { get; set; }
     public string SettingName{ get; set; }
}

dto的要点是当基础文档返回给用户时隐藏基础文档的字段。这是我的地图配置

public class DtoProfile : Profile
{
    public DtoProfile()
    {
        CreateMap<LaunchConfiguration,LaunchConfigurationDto>();
    }
};

我遇到的问题是自动映射器抱怨未映射的基类属性。 “找到了未映射的成员。”这些属性是基类上的属性。我尝试指定此配置文件中将其忽略无济于事。任何人都可以指定执行此操作的正确方法吗?

我的ConfigureServices方法,以防有人怀疑:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSwaggerGen(c =>
        {
            c.SwaggerDoc("v1", new Info { Title = Configuration["ApiInformation:Name"], Version = Configuration["ApiInformation:Version"] });
            c.DescribeAllEnumsAsStrings();
        });

        services.AddAutoMapper(mc =>
        {
            mc.AddProfile(new DtoProfile());
        });
         services.AddMvc().AddJsonOptions(options =>
        {
            options.SerializerSettings.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter());
            options.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;
        });
    }

我的基础课:

 public class Document : IDocument, IDocument<Guid>
{

public Document()
{
  this.Id = Guid.NewGuid();
  this.AddedAtUtc = DateTime.UtcNow;
}

/// <summary>The Id of the document</summary>
[BsonId]
public Guid Id { get; set; }

/// <summary>The datetime in UTC at which the document was added.</summary>
public DateTime AddedAtUtc { get; set; }

/// <summary>The version of the schema of the document</summary>
public int Version { get; set; }
 }

我的实现,其中_mapper是我的注入映射器,_repo是我的注入仓库。调用Map方法时发生异常

 Task ILaunchConfigurationService<LaunchConfigurationDto >.InsertLaunchConfiguration(LaunchConfigurationDto model)
    {
         var mapped =  _mapper.Map<LaunchConfiguration >(model);
        return _repo.AddOneAsync(mapped);
    }

1 个答案:

答案 0 :(得分:2)

只需将ReverseMap()添加到CreateMap调用即可解决您的问题:

public class DtoProfile : Profile
{
    public DtoProfile()
    {
        CreateMap<LaunchConfiguration, LaunchConfigurationDto>().ReverseMap();
    }
};

默认情况下,Automapper创建一种方式映射。如果以一种方式没有特殊的映射,则ReverseMap只是创建反向映射的糖。您也可以这样:

public class DtoProfile : Profile
{
    public DtoProfile()
    {
        CreateMap<LaunchConfiguration, LaunchConfigurationDto>();
        CreateMap<LaunchConfigurationDto, LaunchConfiguration>();
    }
};

您可以在documentation

中了解更多信息

但是,我不能保证您在提交更改时的当前实现不会遇到数据库异常。