我在团队和员工之间有多对多的关联。
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 成员。顺便说一下,Teams 集合是急切的。所以它就在那里。
当 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);
对我来说,这闻起来很刺鼻……