好吧,所以我现在遇到了一个问题,可能是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域结构和自动映射配置意味着我的服务超时没有任何错误,我认为它的试图序列化,并无休止地循环,没有提取和列表为空,所有工作正常当然
请发布您现有的代码 – Paul 2011-03-06 01:10:51
好吧,只要裸露在我身边 – Rosslee 2011-03-06 01:19:39