Automapper和NHibernate懒加载

4
我遇到了这个问题:
我有一个名为“Project”的NHibernate对象列表。这些对象包含一个延迟加载的“Branches”列表。我正在尝试将项目列表传递给WCF服务,因此我正在使用AutoMapper将它们转换为扁平对象。
问题是,即使目标对象“ProjectContract”不包含分支列表,AutoMapper仍会调用此集合,并且对于每个项目,NHibernate会触发懒惰加载并加载Branches集合,所以会进行大量查询。
以下是类和映射:
    public class Project
    {
     public virtual int ID
     {
        get;
        set;
     }

     public virtual string Name { get; set; }
     public virtual string Description { get; set; }

     public virtual IList<Branch> Branches { get; set; }
    }

  [DataContract]
  public class ProjectContract
  {
    [DataMember]
    public virtual int ID
    {
        get;
        set;
    }

    [DataMember]
    public virtual string Name { get; set; }

    [DataMember]
    public virtual string Description { get; set; }
  }

  public class ProjectMappings : Profile
  {
    protected override void Configure()
    {
        Mapper.CreateMap<Project, ProjectContract>();
    }
  }

我的问题是:有没有办法告诉AutoMapper不要触及“分支”集合,因为我不关心它,而且它是一个会触发许多数据库调用的代理?
我暂时通过MaxDepth(0)解决了这个问题,但还有其他实体有我想要传输的集合和我不想被触及的集合,就像这个一样。在这种情况下,MaxDepth(0)将无法起作用。
谢谢, Cosmin
1个回答

2
是的,AutoMapper有一个Ignore功能。
Mapper.CreateMap<Source, Destination>()
    .ForMember(dest => dest.SomeValuefff, opt => opt.Ignore());

我认为这只有在目标上也有该属性时才有效。无论如何,即使我将“Branches”放在目标上并使用忽略选项,集合仍然会被访问并触发加载。我想知道是否有类似的函数可以忽略“源”成员。 - noir
2
@noir,“这里没有什么需要你做的,AutoMapper只关心目标成员。它只尝试映射在目标类型上找到的内容。”摘自http://automapper.codeplex.com/workitem/4031 - gdoron
这也是我想的,为什么要处理那个甚至不在目标上的集合。但我进行了这个简单的测试,获取项目列表并对列表进行映射到项目合同。我使用了NhProf。首先是加载项目的查询,然后对于每个项目,都有一个加载分支的查询。如果我查看堆栈跟踪,它指向AutoMapper.Internal.PropertyGetter.GetValue...所以我正在尝试思考,要么我没有看到什么,要么这是一个错误。 - noir
@noir,请问AutoMapper:https://github.com/AutoMapper/AutoMapper/issues 请友善地告诉我他们的回答。 - gdoron
1
问题解决了。以下是发生的事情:在ProjectContract中,我有一个属性int BranchesCount {get;set;},我打算稍后设置它。我忘记了AutoMapper是如此聪明以至于可以推断出我希望该属性映射到Project.Branches.Count。抱歉,这是我的过失。我花了两天时间才弄清楚这一点。 - noir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接