【问题标题】:NHibernate - Populating Collection with Stored ProcNHibernate - 使用存储过程填充集合
【发布时间】:2014-03-12 21:33:07
【问题描述】:

我有一个实体Transaction,我正在尝试使用NHibernate 中的存储过程检索其列表。我还想急切地加载一对多关系(实体名称TransactionCategorySplitTransaction 上的属性名称是Splits)。我的 sql-query 定义如下所示:

<sql-query name="GetTransactionsForDownload">
    <query-param name="AccountIdentifier" type="Guid"/>
    <query-param name="StartDate" type="DateTime"/>
    <query-param name="EndDate" type="DateTime"/>
    <return alias="Transaction" class="Transaction">
        <return-property column="Transaction.ID" name="ID" />
        <return-property column="Transaction.PostingDate" name="PostingDate" />
        <return-property column="Transaction.EffectiveDate" name="EffectiveDate" />
        <return-property column="Transaction.Amount" name="Amount" />
        <return-property column="Transaction.Balance" name="Balance" />
        ...etc
    </return>
    <return-join alias="TransactionCategorySplit" property="Transaction.Splits">
        <return-property column="TransactionCategorySplit.Amount" name="Amount" />
        <return-property column="TransactionCategorySplit.CreateDate" name="CreateDate" />
        <return-property column="TransactionCategorySplit.TransactionCategoryID" name="TransactionCategoryID" />
        <return-property column="TransactionCategorySplit.TransactionID" name="TransactionID" />
        <return-property column="TransactionCategorySplit.ID" name="ID" />
    </return-join>
  <![CDATA[
    exec core.GetTransactionsForDownload :AccountIdentifier, :StartDate, :EndDate
  ]]>
</sql-query>

存储过程如下所示:

SELECT  t.ID AS 'Transaction.ID' ,
        t.UserID AS 'Transaction.UserID' ,
        t.PostingDate AS 'Transaction.PostingDate' ,
        t.EffectiveDate AS 'Transaction.EffectiveDate' ,
        t.Amount AS 'Transaction.Amount' ,
        t.PrincipalAmount AS 'Transaction.PrincipalAmount' ,
        t.InterestAmount AS 'Transaction.InterestAmount' ,
        t.EscrowAmount AS 'Transaction.EscrowAmount' ,
        t.FeeAmount AS 'Transaction.FeeAmount' ,
        t.OtherAmount AS 'Transaction.OtherAmount' ,
        t.Balance AS 'Transaction.Balance' ,
...etc
         tcs.ID AS 'TransactionCategorySplit.ID' ,
         tcs.TransactionID AS 'TransactionCategorySplit.TransactionID',
         tcs.Amount AS 'TransactionCategorySplit.Amount' ,
         tcs.CreateDate AS 'TransactionCategorySplit.CreateDate' ,
         tcs.TransactionCategoryID AS 'TransactionCategorySplit.TransactionCategoryID' ,
         tcs.TransactionID AS 'TransactionCategorySplit.TransactionID'
 FROM    core.Transactions t
         LEFT OUTER JOIN core.TransactionCategorySplit tcs ON t.ID = tcs.TransactionID
 (where and order by clauses)

当我尝试从中获取结果时,我得到了一个奇怪的异常。这是一个System.IndexOutOfRangeException,其 Message 属性为“ID106_1_”。就像 NHibernate 仍然期望它生成的别名出现在结果集中,它没有考虑我设置的 column 属性。如果我将列别名设置为 NH 所期望的看起来很奇怪的东西,我可以成功取回数据,但这似乎非常糟糕。

sql-query 映射不正确吗?

【问题讨论】:

  • 您的查询有两个不同寻常的地方,1) 列名应该放在方括号中 [] 而不是文字字符串。 2) 不需要 where 子句周围的括号 ()。还有Read this
  • 括号是占位符。我没有发布查询的不相关部分。指定别名时单引号也能正常工作。

标签: c# sql-server nhibernate


【解决方案1】:

如你所见here

请注意,存储过程目前只返回标量和实体。 不支持&lt;return-join&gt;&lt;load-collection&gt;

【讨论】:

  • 既然你这么说,我记得在文档中读过。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 2011-08-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多