Automapper - Bestpractice сопоставления связи многих ко многим в плоский объект - PullRequest
5 голосов
/ 12 сентября 2010

У меня есть две сущности: Employee и Team.

alt text

Мне нужен EmployeeForm с Name из Team.

alt text

Как я могу добиться этого, используя 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 ]

2 голосов
/ 14 сентября 2010

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

alt text

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

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

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

Да вот и все:)

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

alt text

1 голос
/ 13 сентября 2010

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

...