NHibernate使用存储过程OR映射

时间:2011-06-16 13:58:28

标签: c# nhibernate

我在NHibernate中有一个映射,它的工作原理如下:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="BizEntities"
    namespace="BizEntities"
    default-lazy="false">
  <class name="SubscriberQueueItem" table="SubscriberQueueItem">
    <id name="SubscriberQueueItemId" column="Id" type="int" unsaved-value="0">
      <generator class="identity" />
    </id>
    <property name="DateCreated" column="DateCreated"  type="DateTime" />
    <property name="CMIId" column="CMIId" type="int" />
    <property name="DateProcessed" column="DateProcessed"  type="DateTime" />
    <property name="EventStatus" column="EventStatusId" type="QueueStatusTypeValues, BizEntities" />
    <many-to-one  name="Subscription"  class="Subscription" column="SubscriptionId" />
    <property name="ErrorDescription" column="ErrorDescription" type="string" />

  </class>
</hibernate-mapping>

并通过对表的简单查询来检索它。

是否也可以将此类映射到存储过程?我编写了一个程序,它会回写一个难以写入NHibernate查询的特定数据子部分,但很容易写成存储过程。

我可以简单地将存储过程映射添加为已解答here,并根据我的NHibernate查询类型检索具有直接映射或存储过程的对象,或者添加存储过程映射到我的hbm意味着我只能基于该存储过程检索?

2 个答案:

答案 0 :(得分:6)

存储过程在NHibernate中运行得很好,我使用它们没问题:)

您需要在hibernate映射中添加“命名查询”,如下所示:

<sql-query name="spMyProcedure">
    <!-- return type must be an NHibernate mapped entity -->
    <return alias="SubscriberQueueItem" type="BizEntities.SubscriberQueueItem, BizEntities" />

    exec spMyProcedure @Param1=:Param1, @Param2=:Param2
</sql-query>

如果存储过程的返回类型与已映射的实体不匹配,则需要创建一个新实体。

要调用sp,您需要添加以下代码:

var query = session.GetNamedQuery("spMyProcedure");

query.SetParameter("Param1", "hello");
query.SetParameter("Param2", "byebye");

SubscriberQueueItem result = query.UniqueResult<SubscriberQueueItem>();

答案 1 :(得分:0)

我不确定你想要实现什么,但我认为这两件事是相互排斥的。

您可以查看ayende帖子:http://ayende.com/blog/1728/should-you-use-nhibernate-with-stored-procedure