Automapper - Bestpractice сопоставления связи многих ко многим в плоский объект

У меня есть две сущности: Employee а также Team,

альтернативный текст

Что я хочу это 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"));

На мой взгляд, это плохо читается.

Я хотел бы иметь универсальный метод, в котором я могу передать сущность, выбрав коллекцию и сказав, что коллекция имеет нулевое значение, возвращает значение по умолчанию или иным образом выбирает свойство коллекции с помощью лямбда-выражений.

2 ответа

Решение

Я переосмыслил весь свой дизайн, начав менять модель предметной области:

альтернативный текст

Я изменил many-to-many association на две one-to-many associations используя таблицу отношений.

С помощью этой более простой модели предметной области я могу легко сопоставить ее с плоским DTO с помощью AutoMapper.

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

Да вот и все:)

Вот объект модели с плоским видом.

альтернативный текст

Вы можете создать строковое свойство только для чтения на Employee под названием "TeamNames". Поместите туда логику построения списка. Таким образом, у вас есть свойство, которое можно проверить (по сравнению с лямбда-выражением), и оно упростит ваше отображение.

Другие вопросы по тегам