NHibernate在automapper可查询扩展中加载嵌套的复杂对象实体

时间:2015-01-28 15:01:12

标签: c# asp.net asp.net-mvc nhibernate automapper

我有班级员工,其中包含复杂的物业部门。

public Class Employee
{ 
   public int Id { get; set;}
   public Department {get; set;} 
}
public Class Department 
{
  public int Id {get;set;}
  public string Name { get;set;}
}

我为两者创建地图 (考虑到上述两个类都有两个命名空间' source',' destination')

Mapper.CreateMap<source.Employee,destination.Employee>()
Mapper.CreateMap<source.Department,destination.Department>()

当我投影时。

empQueryable.Project().To<destination.Employee>();

如果我看到了NHProfiler 我发现它加载了实体部门 并创建查询

select ... from employee left outer join Department .....

我不知道为什么它会加载实体部门,它应该只是投影。

1 个答案:

答案 0 :(得分:0)

我将在这里走出困境并假设“destination.Employee”包含对“destination.Department”的引用。当AutoMapper构建投影时,它的作用与“Mapper.Map”相同。它一直向下爬行目标类型,其属性和成员的属性。简而言之,它将构建一个Select表达式,如:

.Select(e => new destination.Employee {
    Id = e.Id,
    Department = new destination.Department {
        Id = e.Department.Id,
        Name = e.Department.Name
    }
});

你有几个选择:

  1. 忽略您不希望在员工配置中映射的成员,即“部门”属性
  2. 根据用例创建目标目标类型,不要根据不同需求共享需要不同水合数据的目标类型。
  3. 使用显式扩展(ForMember(d =&gt; d.Department,opt =&gt; opt.ExplicitExpansion()),然后根据需要在投影中显式扩展该成员,并带有“Project.To”的重载要扩展的成员列表。