【问题标题】:Return only the Parent using nHibernate使用 nHibernate 仅返回父级
【发布时间】:2010-10-15 12:33:29
【问题描述】:

我对 nhibernate 很陌生,所以这可能很简单,但我还没有在网上找到答案。

假设我有一个父类和一个子类。父类可以有许多与之关联的子类。现在,当我尝试加载特定的 Parent 时,nhibernate 也会为我填充它的 Child 集合。在某些情况下,我只想返回没有 Child 集合的 Parent 类。

我知道我可以打开延迟加载,但这在我将父序列化为 XML 时不起作用。 XML 序列化程序无法与包含 Child 集合的 nhibernate PersistanceBag 一起使用。

那么有没有办法定义一个 Parent 类,比如说 ParentView,它在同一张桌子上工作,但只包含 Parent 属性,而不是它的所有子孙?

【问题讨论】:

    标签: nhibernate fluent-nhibernate dto


    【解决方案1】:

    定义一个包含您需要检索的列的类 ParentView。确保这个类有一个无参数的构造函数。

    ISession session = NHibernateHelper.Session;
    ISQLQuery query = session.CreateSQLQuery("select Parent_ID, Name form Parent where Parent_ID = :parentID");
    query.SetInt32("parentID", parentID);
    IList<ParentView> parentView = query.SetResultTransformer(Transformers.AliasToBean<ParentView>()).List<ParentView>();
    return parentView;
    

    【讨论】:

    • 看起来很有趣,我正在使用 fluentnhibernate,而且我对 nhibernate 来说总体来说还是很新的。有没有办法使用 fluent 实现相同的结果?
    • Fluent NHibernate 是映射助手。上面介绍的这个解决方案是一个查询,不属于 Fluent NHibernate 的范围。
    【解决方案2】:

    sh_kamalh 建议的创建视图类和关联查询的替代方法(如果我是你,我会考虑)。如果问题与包映射结构有关,那么您可能有几个更简单的解决方案:

    选项 1

    重新审视袋子映射 - 也许简单地选择不同的策略就可以解决问题。我在List vs Set vs Bag in NHibernate 之前已经回答了一个关于不同集合映射的问题,我个人发现我经常使用 Set 策略。要在 Fluent NHibernate 中映射不同的策略,请使用以下内容作为替代指南。

    mapping.HasMany<Child>(x => x.Children).ToSet();
    

    mapping.HasMany<Child>(x => x.Children).ToList();
    

    选项 2

    与 NHibernate 没有特别相关,但如果您使用默认的 xml 序列化程序,您可能可以告诉 xml 序列化程序简单地忽略该属性并保留包映射。

    [System.Xml.Serialization.XmlIgnore]
    public IEnumerable<Child> Children { get; internal set; }
    

    【讨论】:

      猜你喜欢
      • 2020-02-11
      • 2010-10-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-05
      • 1970-01-01
      • 2016-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多