【问题标题】:AutoMapper : Map a many-to-many association into a DTO (Is flattening of collection items supported?)AutoMapper:将多对多关联映射到 DTO(是否支持展平集合项?)
【发布时间】:2010-02-23 13:28:35
【问题描述】:

我在团队和员工之间建立了多对多关联。

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);

对我来说,这闻起来很刺鼻……

【问题讨论】:

    标签: c# nhibernate many-to-many automapper dto


    【解决方案1】:

    由于 FirstOrDefault().Name,你得到了 nullreferenceexception,所以你必须在 firstordefault 之后做一个 null 检查,并告诉 automapper 你想在 null 时返回什么。其他部分应该可以正常工作。

    【讨论】:

    • 我如何在委托中做到这一点:/? Mapper.CreateMap() .ForMember(dest => dest.TeamName, opt => opt.MapFrom(s => s.Teams != null ? return s.Teams.First().Name : 字符串。空的)); --> 这在语法上不起作用。
    • 这看起来像是在编译代码,但是来自团队的空引用是空的,还是团队是空的? opt.MapFrom(s => s.Teams.FirstOrDefault() == null ? string.Empty : s.Teams.FirstOrDefault().Name)
    • Teams 可以为空,所以它来自那里。
    • 1.当我看到您的构造函数时,它不能为空 2。nullreference 异常将使用 firstordefault 中的参数“source”而不是“name”
    • 对不起,我错了,我现在检查了机器人,它可以工作:o 谢谢!
    猜你喜欢
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 2020-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 2012-07-31
    相关资源
    最近更新 更多