NHibernate:将多个类映射到同一视图

时间:2009-07-22 13:30:59

标签: nhibernate nhibernate-mapping

我需要将两个不同的类映射到同一视图,并收到存在重复映射的错误。这在NHibernate有可能吗?如果没有,任何人都可以指示我如何解决这个映射问题。

我处理的是一成不变的观点。一个视图返回分成两个类所需的数据。该视图如下所示:

vw_player_points
----------------
Id
GameID
PlayerID
Points

这些课程必须是“玩家”,并且有一系列游戏

select gameid from vw_player_points where playerid = <PlayerID>

每个'游戏'都需要一个玩家及其积分列表:

select playerid, points from vw_player_points where gameid = <GameID>

我已经尝试了每个具体的表继承以及两次映射到同一个视图,但没有任何乐趣:(

这是放入一个xml片段的“粗略”映射。注意我还需要映射到一个接口(有效)

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="DomainModel" namespace="Test">

  <class name="IPlayer" abstract="true">

    <id name="Id" column="id">
      <generator class="assigned"/>
    </id>

    <union-subclass name="Player" table="vw_player">
        <bag name="Games">
            <key column="player_id"/>
            <one-to-many class="Test.IGame" not-found="ignore"/>
        </bag>
    </union-subclass>

  </class>

  <class name="IGame" abstract="true">

    <id name="Id" column="game_id">
      <generator class="assigned"/>
    </id>

    <union-subclass name="Game" table="vw_player_points">
        <bag name="Points">
            <key column="game_id"/>
            <one-to-many class="Test.IPlayerPoints" not-found="ignore"/>
        </bag>
    </union-subclass>

  </class>

  <class name="IPlayerPoints" abstract="true">

    <id name="Id" column="id">
      <generator class="assigned"/>
    </id>

    <union-subclass name="PlayerPoints" table="vw_player_points">
      <property not-null="false" name="PlayerId" column="player_id"/>
      <property not-null="false" name="Points" column="points"/>
    </union-subclass>

  </class>

</hibernate-mapping>

1 个答案:

答案 0 :(得分:1)

使用表单的抽象/子类映射时,似乎无法将多个类映射到单个视图:

<class name="I[Entity]" abstract="true">

    <union-subclass name="[Entity]">
        ...
    </union-subclass>

</class>

我最终使用正确运行的proprty-ref属性直接映射到具体类:

<class name="Game" table="vw_player_points">

    <id name="Id" column="id">
        <generator class="hilo"/>
    </id>

    <property not-null="false" name="GameId" column="gameid"/>

    <bag name="Points">
        <key column="gameid" property-ref="GameId"/>
        <one-to-many class="PlayerPoints" not-found="ignore"/>
    </bag>

</class>

<class name="PlayerPoints" table="vw_player_points">

    <id name="Id" column="id">
        <generator class="hilo"/>
    </id>

    <property not-null="false" name="PlayerId" column="playerid"/>
    <property not-null="false" name="Points" column="points"/>

</class>

也许“抽象”子映射类型会否定使用union-subclass hack映射到接口。