2016-12-05 145 views
1

我们正在设计一个实体定义可以改变的时间系统。我试图设置Automapper,但无法弄清楚前缀应该如何工作。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(“当前”),但没有任何效果。

回答

1

我已经尝试添加RecognizePrefixes( “当前”)

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

例如,如果你有以下类:

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的具体映射。

关于你自己的地图,因为在ReferenceDataReferenceDataDTOId属性具有相同的名称,你应该能够删除ID件映射为AutoMapper能够自动推断它:

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

这应该足够了。

至于.Current使用Flattening如果您要更改DTO类以将其重命名为CurrentName,则可以将其删除。