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". Поместите туда логику построения списка. Таким образом, у вас есть свойство, которое можно проверить (по сравнению с лямбда-выражением), и оно упростит ваше отображение.