使用nHibernate仅返回Parent

时间:2010-10-15 12:33:29

标签: nhibernate fluent-nhibernate dto

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

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

我知道我可以打开Lazy加载,但是这不能用作将父级序列化为XML。 XML序列化程序无法使用包含Child集合的nhibernate PersistanceBag。

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

2 个答案:

答案 0 :(得分:3)

定义一个包含您需要检索的列的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;

答案 1 :(得分:0)

根据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; }