nHibernate - 存储过程和复合键

Jef*_*eff 2 nhibernate stored-procedures composite-key

我正在尝试使用nHibernate将存储过程的输出映射到项目中的对象.

该对象是这样的:

public class NewContentSearchResult
{
    public string Name { get; set; }
    public string ContentType { get; set; }
    public int Count { get; set; }
    public int CMIId { get; set; }
    public int FeatureId { get; set; }

    public override bool Equals(object obj)
    {
        return base.Equals(obj);
    }

    public override int GetHashCode()
    {
        return base.GetHashCode();
    }
}
Run Code Online (Sandbox Code Playgroud)

并且映射看起来像这样:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Class.Assembly"
    namespace="Class.Assembly"
    default-lazy="false" default-cascade="none">
  <class name="NewContentSearchResult" mutable="false" check="none">
    <composite-id unsaved-value="none">
      <key-property name="CMIId" type="int" />
      <key-property name="FeatureId" type="int" />
    </composite-id>
    <property name="ContentType" type="string" />
    <property name="Name" type="string" />
    <property name="Count" type="int" />
  </class>
  <sql-query name="spWebGetNewContentBySalesRole">
    <return class="NewContentSearchResult" lock-mode="read">
      <return-property name="Name" column="Name" />
      <return-property name="ContentType" column="FeatureDesc" />
      <return-property name="Count" column="Number" />
      <return-property name="CMIId" column="CMIId" />
      <return-property name="FeatureId" column="FeatureId" />
    </return>
    exec core.spWebGetNewContentBySalesRole :SalesRoleId
  </sql-query>
</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)

存储的proc调用是正确的,我得到了SalesRoleId 266的结果(作为示例):

CMIId       FeatureDesc       FeatureId     Name       Count
4000719 Guest Book          12     Charlie Brown    2
4000719 Audio Guest Book    3      Charlie Brown    1
Run Code Online (Sandbox Code Playgroud)

没有复合键(仅使用CMIId)它可以正常工作,除非有2个结果(如上所述)共享CMIId ...第二个被第一个覆盖.

我必须使用复合键,CMIId/FeatureId是逻辑组合.

当我现在运行时,我得到一个例外:

NHibernate.ADOException: could not execute query
[ exec core.spWebGetNewContentBySalesRole ? ]
  Name: SalesRoleId - Value: 266
[SQL: exec core.spWebGetNewContentBySalesRole ?] --->  System.IndexOutOfRangeException: CMIId22_0_.
Run Code Online (Sandbox Code Playgroud)

Jef*_*eff 5

好的,进一步的研究使我确信当你使用存储过程时,在nHibernate中不可能有复合id.

为此,我修改了我的SQL以包含rownumber(),我将其用作id.我只能这样做,因为它是只读的,没有写入数据库,但它适用于我的目的.