Java NHibernate获取/自动映射问题
好的,我现在有一个问题,要么是AutoMapper,我的NHibernate查询,要么是Domain/DTO设计 我遇到的问题是,当我进行提取时,例如ObjectA包含ObjectB的列表,ObjectB具有其父ObjectA的属性。当我有一个对我的ObjectA的ObjectB属性进行急切获取的查询时,我就可以无限地继续进行a.B.a.B.a.B.a.B.B.a.B等等 这意味着,当我尝试将域对象映射到包含相同交易的DTOA时,DTOA有一个DTOB列表,DTOB有其父DTOA的属性。我的服务在返回时超时,因为我相信我正在使用AutoMapper将DomainA映射到DTOA,然后因为DTOA.DTOB.DTOA.DTOB等被无限序列化填充 不管怎么说,我确信最好的解决方案是一个古老的经典问题,但我正在努力找到合适的东西输入我的老朋友谷歌。我是否可以让AutoMapper忽略子对象中的父实例,甚至我认为如果我可以让Nhibernate获取列表,但在父属性上保留一个代理,我更愿意这样做。最糟糕的解决方案是使用特定场景或特定逻辑的对象更改域对象 谢谢你的帮助 编辑代码 映射代码Java NHibernate获取/自动映射问题,java,nhibernate,orm,automapper,dto-mapping,Java,Nhibernate,Orm,Automapper,Dto Mapping,好的,我现在有一个问题,要么是AutoMapper,我的NHibernate查询,要么是Domain/DTO设计 我遇到的问题是,当我进行提取时,例如ObjectA包含ObjectB的列表,ObjectB具有其父ObjectA的属性。当我有一个对我的ObjectA的ObjectB属性进行急切获取的查询时,我就可以无限地继续进行a.B.a.B.a.B.a.B.B.a.B等等 这意味着,当我尝试将域对象映射到包含相同交易的DTOA时,DTOA有一个DTOB列表,DTOB有其父DTOA的属性。我的服务
Mapper.CreateMap<DTOA, DomainA>();
Mapper.CreateMap<DomainA, DTOA>()
.ForMember(dst => dst.AProperty,
opts =>
opts.ResolveUsing<LazyLoadResolver>().FromMember(src => src.AProperty));
Mapper.CreateMap();
Mapper.CreateMap()
.FormMember(dst=>dst.A属性,
选项=>
opts.ResolveUsing().FromMember(src=>src.apProperty));
域对象域
/// <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; }
}
//
///数据传输对象,表示用户的对象
///
公共类域
{
///
///获取或设置族。
///
///家族。
公共虚拟IList属性{get;set;}
}
域对象域B
/// <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; }
//
///氏族成员的DTO
///
公共类域B
{
///
///获取或设置ID。
///
///身份证。
公共虚拟整数ID{get;set;}
///
///获取或设置用户。
///
///用户。
公共虚拟域BProperty{get;set;}
}
Nhibernate查询
return session.QueryOver<DomainA>()
.Where(a => a.ID == id)
.Fetch(a=> a.AProperty).Eager
.List<DomainA>().FirstOrDefault();
return session.QueryOver()
.其中(a=>a.ID==ID)
.Fetch(a=>a.approperty)
.List().FirstOrDefault();
WCF服务返回语句
return AutoMapper.Map<DomainA, DTOA>(returnedDomainA);
return AutoMapper.Map(returnedDomainA);
使用fetching和dto域结构和自动映射器配置运行该查询意味着我的服务不会出错,我假设它正在尝试序列化,并且是无休止的循环,没有fetch和list为null,所有这些都可以正常工作,当然,所以我决定使用这两个选项来解决这个问题 方案A 更改DomainB映射的自动映射器以忽略作为DomainA实例的DomainB上的属性 这意味着映射将是单向的,而不是双向的 方案B
从DomainB中删除DomainA属性!在考虑了我希望系统执行的操作后,我决定删除这些链接回家长的属性请发布您的现有代码