好吧,所以我現在遇到了一個問題,可能是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