1

我们正在设计一个实体的定义可以改变的时间系统。我正在尝试设置 Automapper,但无法完全确定前缀应该如何工作。

例如,我将拥有以下实体:

public class ReferenceDataDefinition
{
    public string Name { get; set; }
}

public class ReferenceData 
{
    public int Id { get; set; }
    public ReferenceDataDefinition Current { get; set; }
}

使用以下 DTO:

public class ReferenceDataDTO
{
    public int Id { get; set; }
    public string Name { get; set; }
}

我知道我可以使用

CreateMap<ReferenceData, ReferenceDataDTO>()
    .ForMember(p => p.Id, o => o.MapFrom(s => s.Id)
    .ForMember(p => p.Name, o => o.MapFrom(s => s.Current.Name);

但我觉得我必须做一些更聪明的事情?我试过添加 RecognizePrefixes("Current") 但这没有效果。

4

2 回答 2

1

我试过添加 RecognizePrefixes("Current")

这不是前缀的使用方式。它们适用于您的属性以前缀开头的场景(通常是因为数据库命名模式)。

例如,如果您有以下课程:

public class ReferenceData 
{
    public int Ref_Id { get; set; }
    public string Ref_Name { get; set; }
}

public class ReferenceDto
{
    public int Id { get; set; }
    public string Name { get; set; }
}

您可以识别以下前缀:

cfg.RecognizePrefixes("Ref_");

然后 AutoMapper 将能够映射这两个对象,而无需使用.ForMember.

关于您自己的映射,由于两个Id属性ReferenceDataReferenceDataDTO具有相同的名称,因此您应该能够删除 Id 成员映射,因为 AutoMapper 可以自动推断它:

CreateMap<ReferenceData, ReferenceDataDTO>()
    .ForMember(p => p.Name, o => o.MapFrom(s => s.Current.Name);

这应该足够了。

至于.Current使用Flattening,如果您更改 DTO 类以将其重命名为CurrentName.

于 2016-12-07T14:01:01.810 回答
0

请检查此文档: 识别前/后缀 此外,RecognizePrefixes 适用于源对象前缀使用 RecognizeDestinationPrefixes 方法

检查这些以前的帖子: AutoMapper with prefix https://github.com/AutoMapper/AutoMapper/issues/421

于 2016-12-05T18:45:04.287 回答