【问题标题】:How to Populate the Child Collections / Associations of an Entity from a Stored Procedure using NHibernate如何使用 NHibernate 从存储过程中填充实体的子集合/关联
【发布时间】:2012-08-21 20:04:48
【问题描述】:

我想知道是否有一种方法可以从 NHibernate 中的存储过程中填充递归实体(子集合/关联)。假设我有下一节课:

public class Category
{
  public int category_id { set; protected get; }
  public string category_description { set; get; }
  public IEnumerable<Category> SubCategories { set; get; }

  ....
}

有没有办法从存储过程中获取根类别列表,该存储过程获取一组类别及其整个子树,每个类别在 SubCategories 属性中都有其各自的子级?我想得到与“Eagerly load recursive relation”中提出的解决方案相同的结果,但从存储过程而不是表中获取结果。

【问题讨论】:

  • 我不知道。如果不构建 SQL 本身,Hibernate 将不知道如何将结果映射回实例。假设你不知道要走多深——通过投影你可能能够重建一些,但不知道每件事有多少层,或者不让它们都具有完全相同的深度,这是行不通的。如果它是一个存储过程,为什么还要使用 Hibernate?您可以跳过它并为自己省去麻烦。如果您需要对任何类别进行更改,请在已更改的实例上使用 Merge 将它们一一推回 Hibernate 的会话中。
  • 有点类似于 Jon 的评论,但方法不同:为什么要为此使用用户存储过程?它们增加了什么价值?
  • 我想使用存储过程,因为我需要过滤结果,包括 root 和 children,我没有找到仅使用 Criteria 的方法。

标签: c# nhibernate stored-procedures nhibernate-mapping nhibernate-criteria


【解决方案1】:

这可以通过命名查询来实现。在此处查看有关命名查询的官方 NHibernate 文档:http://nhibernate.info/doc/nh/en/index.html#querysql-namedqueries

您要做的是使用命名查询的功能,它允许您加入关联:&lt;return-join /&gt;

NHibernate 博客上也有一个关于同一主题的示例:http://nhibernate.info/blogs/nhibernate/archive/2008/11/24/populating-entities-with-associations-from-stored-procedures-with-nhibernate.aspx

复杂的例子:

<sql-query name="GetCategory">
    <return alias="Category" class="Category"/>
    <return-join alias="Subcategory" property="Category.SubCategories">
        <return-property column="Subcategory.SubcategoryId" name="Id" />
    </return-join>
    EXEC someStoredProcedureName :CategoryId
</sql-query>

【讨论】:

  • 非常感谢,我试试看。
  • 我仍然无法加载整个树,但它对于加载主从数据很有用。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-11
  • 1970-01-01
  • 2011-08-26
  • 2013-07-08
相关资源
最近更新 更多