我对nhibernate很新,所以这可能非常简单,但我还没有在网上找到答案。
假设我有一个Parent类和一个Child类。父类可以有许多与之关联的子类。现在,当我尝试加载特定的父类时,nhibernate也会为我填充其Child集合。在某些情况下,我只想返回没有Child集合的Parent类。
我知道我可以打开Lazy加载,但是这不能用作将父级序列化为XML。 XML序列化程序无法使用包含Child集合的nhibernate PersistanceBag。
那么有没有办法定义一个Parent类,让我们说ParentView在同一个表上工作,但只包含Parent属性而不是它的所有子孙?
答案 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; }