2011-03-06 138 views
0

好吧,所以我现在遇到了一个问题,可能是AutoMapper,我的NHibernate查询或Domain/DTO设计。NHibernate抓取/自动映射器问题

我遇到的问题是,当我做一个抓取,例如ObjectA包含ObjectB的列表,并且ObjectB具有其父ObjectA的属性。当我有一个查询在我的ObjectA的ObjectB属性上进行了一次急切的获取时,那么我可以永远无限地继续A.B.A.b.A.B.A.B等等。

这意味着当我尝试将域对象映射到包含相同交易的DTOA时,DTOA具有DTOB列表,并且DTOB具有其父DTOA的属性。我的服务在返回时超时,因为我相信我使用AutoMapper将DomainA映射到DTOA,然后是因为DTOA.DTOB.DTOA.DTOB等被无限序列化。

无论如何,最好的解决方案,我敢肯定的是一个古老的经典问题,但我正在努力找到正确的东西输入到我的老朋友谷歌。我可以让AutoMapper忽略子进程中的父实例,最好甚至我认为如果我可以让Nhibernate获取列表,但在父属性上保留一个代理。最糟糕的解决方案是使用特定场景或特定逻辑的对象更改域对象。

任何帮助表示赞赏谢谢。

编辑 - CODE

映射代码

Mapper.CreateMap<DTOA, DomainA>(); 
     Mapper.CreateMap<DomainA, DTOA>() 
      .ForMember(dst => dst.AProperty, 
         opts => 
         opts.ResolveUsing<LazyLoadResolver>().FromMember(src => src.AProperty)); 

Domain对象DomainA中

/// <summary> 
    /// Data Transfer Object, object representing a user 
    /// </summary> 
    public class DomainA 
    { 
     /// <summary> 
     /// Gets or sets the clans. 
     /// </summary> 
     /// <value>The clans.</value> 
     public virtual IList<DomainB> AProperty{ get; set; } 
} 

Domain对象DomainB中

/// <summary> 
/// DTO for clan members 
/// </summary> 
public class DomainB 
{ 
    /// <summary> 
    /// Gets or sets the ID. 
    /// </summary> 
    /// <value>The ID.</value> 
    public virtual int ID { get; set; } 

    /// <summary> 
    /// Gets or sets the user. 
    /// </summary> 
    /// <value>The user.</value> 
    public virtual DomainA BProperty{ get; set; } 

}

NHibernate的查询

return session.QueryOver<DomainA>() 
       .Where(a => a.ID == id) 
       .Fetch(a=> a.AProperty).Eager 
       .List<DomainA>().FirstOrDefault(); 

WCF服务return语句

return AutoMapper.Map<DomainA, DTOA>(returnedDomainA); 

运行与取该查询和DTO域结构和自动映射配置意味着我的服务超时没有任何错误,我认为它的试图序列化,并无休止地循环,没有提取和列表为空,所有工作正常当然

+0

请发布您现有的代码 – Paul 2011-03-06 01:10:51

+0

好吧,只要裸露在我身边 – Rosslee 2011-03-06 01:19:39

回答

0

所以我决定,两个选项来解决这样的问题È

选项A

更改AutoMapper为DomainB中的映射到忽略DomainB中属性是DomainA中

的实例这将意味着所述映射将是一个方向,而不是双向

选项B

从DomainB删除DomainA属性!考虑到我想让系统做什么,我决定删除这些连接父母的属性