Automapper – 将多对多关联映射到平面对象的最佳实践

我有两个实体: EmployeeTeam

替代文字

我想要的是一个拥有Team NameEmployeeForm

替代文字

如何使用AutoMapper实现此目的?

我目前的“解决方案”如下:

 Mapper.CreateMap() .ForMember(dest => dest.TeamName, opt => opt.MapFrom(x => x.GetTeams().FirstOrDefault() != null ? string.Join(", ", x.GetTeams().Select(y=>y.Name)) : "n/a")); 

在我看来,这是可读的。

我想要的是一个generics方法,我可以传递一个实体,选择集合并说集合是否为null返回默认值,或者通过lambda表达式选择集合的属性。

我重新考虑我的整个设计开始更改域模型

替代文字

我使用关系表one-to-many associations更改为两个one-to-many associations

有了这个更简单的域模型 ,我可以使用AutoMapper轻松将其映射到平面DTO

 public class TeamEmployeeMapperProfile : Profile { protected override void Configure() { CreateMap(); } } 

是的,这就是:)

这是平面视图模型对象。

替代文字

您可以在Employee上创建一个名为“TeamNames”的只读字符串属性。 将列表构建逻辑放在那里。 这样,你就拥有了一个可测试的属性(相对于lambda表达式),它将使你的映射更容易。