2016-07-15 10 views
0

Ich habe ein Modell wie diesesMapping zwei bidirektionale Sammlungen des gleichen Typs in Nhibernate

public class Scene 
{ 
    public virtual ICollection<Ray> Rays1 {get; set;} 
    public virtual ICollection<Ray> Rays2 {get; set;} 
} 

public class Ray 
{ 
    public virtual Scene Parent {get; set;} 
} 

Wenn ich es auf diese Weise zu halten und wo es sich mit zwei Eins-zu-viele-Beziehungen dies geschieht:

  • erstellen Szene
  • hinzufügen 3 Artikel auf Rays1
  • hinzufügen 2 Artikel auf Rays2
  • zu Datenbank-Commit
  • Query-Szene aus der Datenbank

Nun sind beide Rays1 und Rays2 haben 5 Elemente, weil sie

Die einzige Lösung, die gleichen Eltern-ID teilen, die ich von ist einfiel 2 neue Klassen von Ray zu erben und dann kartieren Sie jede von ihnen mit Eins-zu-Viele-Beziehungen. Dadurch werden zwei separate Tabellen in der Datenbank erstellt, die jedoch genau dieselben Spalten haben. Es fühlt sich einfach nicht richtig an ...

Gibt es noch andere Lösungen?

--edit--

Als Referenz sind hier meine Mapping-Dateien:

<?xml version="1.0" encoding="utf-8" ?> 
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
         assembly="PanoMeasurer.Core.Domain" 
         namespace="PanoMeasurer.Core.Domain"> 
    <class name="Panorama"> 

     <id name="OID" generator="guid.comb"/> 

     <property name="HeadingBase"/> 

     <set name="Rays1" cascade="all-delete-orphan"> 
     <key column="PanoramaId" /> 
     <one-to-many class="Ray"/> 
     </set> 

     <set name="Rays2" cascade="all-delete-orphan"> 
     <key column="PanoramaId" /> 
     <one-to-many class="Ray"/> 
     </set> 
    </class> 

    </hibernate-mapping> 

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
        assembly="PanoMeasurer.Core.Domain" 
        namespace="PanoMeasurer.Core.Domain"> 
    <class name="Ray"> 
    <id name="OID" generator="guid.comb"/> 
    <property name="Heading"/> 
    <property name="Elevation"/> 
    <many-to-one name="Owner" class="Panorama" column="PanoramaId" /> 
    </class> 
</hibernate-mapping> 

Antwort

1

Wenn Sie mit einem einzigen Mapping wählen gehen, dann können Sie die Rays1 und Rays2 machen als Filter auf eine Strahlenliste.

öffentliche virtuelle ICollection Rays1 {Return Rays.Where()};

+0

Schöne Idee ... Ich musste eine neue Eigenschaft RayType auf der Ray-Klasse erstellen, aber es ist viel besser als zwei vergebliche Klassen erben. Auch ist für den Kunden alles unsichtbar, was perfekt ist ... Vielen Dank ... – RBasniak

Verwandte Themen