У меня есть много-много связей между Командой и Сотрудником.
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);
Для меня это пахнущая боль ...