NHibernate - 从存储过程填充单个属性

时间:2008-11-10 18:30:52

标签: nhibernate

目前有以下映射文件:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
    namespace="NHibernateHelpers"
    assembly="App_Code.NHibernateHelpers">
  <class name="NHibernateHelpers.Fixture, App_Code" table="Fixture_Lists">
    <id name="Id" column="UniqRefNo">
      <generator class="guid" />
    </id>
    <property name="Date" column="FixDate"/>
    <property name="HomeTeamId" column="HomeId"/>
    <property name="HomeTeamName" column="Home_Team"/>
    <property name="AwayTeamId" column="AwayId"/>
    <property name="AwayTeamName" column="Away_Team"/>
    <property name="Kickoff" column="Kickoff"/>
    <bag name="Goals">
      <key column="FixID" />
      <one-to-many class="NHibernateHelpers.Goal, App_Code"/>
    </bag>
    <bag name="Bookings">
      <key column="FixID" />
      <one-to-many class="NHibernateHelpers.Booking, App_Code"/>
    </bag>
    <many-to-one name="HomeTeam" class="NHibernateHelpers.Team" column="HomeId" />
    <many-to-one name="AwayTeam" class="NHibernateHelpers.Team" column="AwayId" />
    <many-to-one name="Division" class="NHibernateHelpers.Division" column="Div_Comp" />
    <property name="HomeFullTimeScoreCode" column="Home_FT_Score"/>
    <property name="AwayFullTimeScoreCode" column="Away_FT_Score"/>
  </class>
</hibernate-mapping>

它很好地映射到我继承的遗留数据库,但我想添加一个名为“MatchTime”的属性,其中包含存储过程的输出:

EXEC GetMatchTime @FixtureId = :Id

其中:Id是当前Fixture对象的Id。

这是否可以在映射文件中使用?

3 个答案:

答案 0 :(得分:1)

小kludgy - 但是如何不将sp转换为函数,而是创建新函数并将它们用作现有sp的包装器?您可以将Id添加到函数中,并将其传递给存储过程,获取执行sp的结果,然后将其传回。

http://sqlblog.com/blogs/denis_gobo/archive/2008/05/08/6703.aspx

答案 1 :(得分:0)

您可能需要稍微调整一下这个参数,但它应该可以工作(Id与Fixture.Id的名称相匹配):

<property name='MatchTime' formula='(EXEC GetMatchTime Id)'/>

http://ayende.com/Blog/archive/2006/12/26/LocalizingNHibernateContextualParameters.aspx

答案 2 :(得分:0)

@Watson

公式的内容由NHibernate作为子查询添加,因此生成的SQL最终看起来像:

SELECT FieldA, FieldB, FieldC, ( EXEC GetMatchTime Id ) FROM Fixture_Lists

由于存储过程不允许作为子查询而遗憾地失败。

我可以将存储过程转换为函数,但是有很多函数,它可能会破坏遗留代码。