【问题标题】:NHibernate fetching/automapper issuesNHibernate 获取/自动映射器问题
【发布时间】:2011-03-06 01:00:39
【问题描述】:

好的,我现在有一个问题,要么是 AutoMapper,要么是我的 NHibernate 查询或域/DTO 设计。

我遇到的问题是,当我进行提取时,例如 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 获取列表但在父属性上保留一个代理,我最好。最糟糕的解决方案是使用特定场景或特殊逻辑的对象更改域对象。

任何帮助表示感谢。

编辑 - 代码

映射代码

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

域对象域A

 /// <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; }
}

域对象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; }

}

休眠查询

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

WCF 服务返回声明

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

使用 fetching 和 dto 域结构和自动映射器配置运行该查询意味着我的服务超时而没有错误,我假设它试图序列化并且无休止地循环,没有 fetch 和列表为空,一切正常当然

【问题讨论】:

  • 请发布您现有的代码

标签: java nhibernate orm automapper dto-mapping


【解决方案1】:

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

选项 A

更改用于映射 DomainB 的 AutoMapper 以忽略 DomainB 上作为 DomainA 实例的属性

这意味着映射将是一个方向而不是双向

选项 B

从 DomainB 中删除 DomainA 属性!在考虑了我希望系统执行的操作后,我决定删除这些链接回父母的属性

【讨论】:

    猜你喜欢
    • 2011-08-19
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    相关资源
    最近更新 更多