4
我很困扰这个问题:Automapper和NHibernate延迟加载
我有一个名为“项目”的NHibernate对象的列表。这些对象包含一个延迟加载的“分支”列表。我正在尝试将项目列表传递给WCF服务,所以我使用AutoMapper将它们转换为平面对象。
问题是,即使名为“ProjectContract”的目标对象不包含分支列表,Automapper仍会调用此集合,并且会对数据库进行很多查询,因为NHibernate会引发延迟加载并加载每个项目的分支收集。
这里是类和映射:
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)将不起作用。
谢谢 科斯明
我认为这只有在物业也在目的地时才有效。在任何情况下,即使我将“分支”放在目标上并使用“忽略”选项,仍然可以访问集合并触发加载。 我很感兴趣,如果有一个类似的功能忽略“源”成员。 – noir
@noir,“你在这里没有什么需要做的,AutoMapper只关心目标成员,它只会尝试映射它在目标类型上找到的内容。”采取从http://automapper.codeplex.com/workitem/4031 – gdoron
这也是我认为,为什么打扰,甚至没有目的地的集合。但是我做了这个简单的测试,获得了项目清单,并将清单映射到项目合同。我用NhProf。首先是加载项目的查询,然后为每个项目都有一个加载分支的查询。如果我看着堆栈跟踪,它指向AutoMapper.Internal.PropertyGetter.GetValue ...所以我想要想我或没有看到什么,或者这是一个错误。 – noir