チームと従業員の間には多対多の関係があります。
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);
私にとって、これはペントの匂いがします...