5

我有两个实体:EmployeeTeam.

替代文字

我想要的是一个EmployeeForm具有Name.Team

替代文字

如何使用AutoMapper实现这一点?

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

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

在我看来,这很难读。

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

4

2 回答 2

2

我重新考虑了我的整个设计,开始改变领域模型

替代文字

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

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

public class TeamEmployeeMapperProfile : Profile
{
    protected override void Configure()
    {
        CreateMap<TeamEmployee, TeamEmployeeForm>();
    }
}

是的,仅此而已:)

这是平面视图模型对象。

替代文字

于 2010-09-13T21:43:59.793 回答
1

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

于 2010-09-13T12:30:35.890 回答