AutoMapper: сопоставление ассоциации «многие ко многим» в DTO (поддерживается ли выравнивание элементов коллекции?) - PullRequest
0 голосов
/ 23 февраля 2010

У меня есть много-много связей между Командой и Сотрудником.

public class Employee : Entity
{
    public virtual string LastName { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string EMail { get; set; }
    public virtual IList<LoanedItem> LoanedItems { get; private set; }
    public virtual ISet<Team> Teams { get; private set; }

    public Employee()
    {
        if (LoanedItems == null)
        {
            LoanedItems = new List<LoanedItem>();
        }

        if (Teams == null)
        {
            Teams = new HashedSet<Team>();
        }
    }

    public virtual Employee AddTeam(Team team)
    {
        Teams.Add(team);
        team.Employees.Add(this);

        return this;
    }

    public virtual Employee RemoveTeamFromEmployee(Team team)
    {
        Teams.Remove(team);
        team.Employees.Remove(this);

        return this;
    }
}

public class Team : Entity
{
    public virtual string Name { get; set; }
    public virtual ISet<Employee> Employees { get; private set; }

    public Team()
    {
        if (Employees == null)
        {
            Employees = new HashedSet<Employee>();
        }
    }

    public virtual Team RemoveEmployeeFromTeam (Employee employee)
    {
        Employees.Remove(employee);
        employee.Teams.Remove(this);

        return this;
    }

    public virtual Team AddEmployee(Employee employee)
    {
        Employees.Add(employee);
        employee.Teams.Add(this);

        return this;
    }
}

Я хочу отобразить это в следующем DTO.

public class EmployeeForm
{
    public string LastName { get; set; }
    public string FirstName { get; set; }
    public string EMail { get; set; }
    public string TeamName { get; set; }
    public int Id { get; set; }
}

То есть TeamName - это тот, кто должен быть сопоставлен.

Я использую следующий код сопоставления:

Mapper.CreateMap<Employee, EmployeeForm>()
    .ForMember(dest=>dest.TeamName, opt => opt.MapFrom(s=>s.Teams.FirstOrDefault().Name));
var mappedresult = Mapper.Map<List<Employee>, List<EmployeeForm>>(result);

Проблема в члене Employee.Teams. Между прочим, коллекция команд уже загружена. Так оно и есть.

Когда команды имеют значение Null, я получаю исключение NullReference.

Как я могу отобразить название команды в DTO?

РЕДАКТИРОВАТЬ: на данный момент я оставил Automapper и вместо этого использовать этот громоздкий код:

var result = _repository.GetAllView();

var employeeForms = new List<EmployeeForm>();
foreach (Employee employee in result)
{
    var employeeAdded = false;
    foreach (var team in employee.Teams)
    {
        employeeForms.Add(new EmployeeForm
          {
              EMail = employee.EMail,
              FirstName = employee.FirstName,
              LastName = employee.LastName,
              TeamName = team.Name
          });
        employeeAdded = true;
    }

    if (!employeeAdded)
    {
        employeeForms.Add(new EmployeeForm
        {
            EMail = employee.EMail,
            FirstName = employee.FirstName,
            LastName = employee.LastName,
            TeamName = string.Empty
        });
    }
}
return View(employeeForms);

Для меня это пахнущая боль ...

1 Ответ

2 голосов
/ 23 февраля 2010

Вы получаете исключение nullreference из-за FirstOrDefault (). Name, поэтому вы должны выполнить нулевую проверку после firstordefault и сообщить autopper, что вы хотите вернуть, когда null. Остальные части должны работать нормально.

...