2009-07-22 15 views
2

Ich muss zwei verschiedene Klassen in derselben Ansicht zuordnen und einen Fehler erhalten, dass eine doppelte Zuordnung vorhanden ist. Ist das in NHibernate möglich? Wenn nicht, kann mir jemand Anweisungen geben, wie ich dieses Kartierungsproblem lösen kann.NHibernate: Zuordnen mehrerer Klassen zu derselben Ansicht

Ich arbeite mit Ansichten, die in Stein gemeißelt sind. Eine Ansicht bringt Daten zurück, die zur Aufteilung in zwei Klassen benötigt werden. Die Ansicht wie folgt aussieht:

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

Die Klassen müssen ‚Spieler‘ sein, mit einer Liste von Spielen gespielt

select gameid from vw_player_points where playerid = <PlayerID> 

Und jedes ‚Spiel‘ muss eine Liste der Spieler und ihre Punkte:

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

ich habe versucht, Tisch-per-Beton Klassenvererbung aswell als Abbildung auf die gleiche Ansicht zweimal, aber haben keine Freude hatte :(

Hier sind die 'groben' Mappings in ein XML-Snippet. Beachten Ich muss auch an eine Schnittstelle Karte (die funktioniert)

<?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> 
+0

Können Sie Ihre Zuordnung für jede Klasse veröffentlichen? –

+0

Mappings gepostet :) – theGecko

+0

Irgendwelche Ideen dazu? – theGecko

Antwort

1

Es scheint unmöglich, mehrere Klassen zu einer einzigen Ansicht abzubilden bei der Verwendung von abstrakten/Unterklasse Abbildung der Form:

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

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

</class> 

ich landete Mapping direkt auf die konkreten Klassen nach oben mit dem proprty-ref Attribute, das richtig funktioniert:

<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> 

Vielleicht ein ‚abstrakter‘ Unter Mapping-Typ würde die Verwendung des union-Unterklasse Hack m negiert apping an Schnittstellen.

+0

ist es klar !! Schön! –

+0

Sorry, aber sollte es nicht in der Tasche sein? – wenqiang

Verwandte Themen