NHibernate - come mappare la raccolta di alberi
-
10-07-2019 - |
Domanda
Voglio mappare il mio modello a oggetti su NHibernate. C'è una parte difficile nel mio concetto e non so se sia possibile farlo in NHibernate.
Voglio avere una raccolta di alberi. Ho due classi (sotto, solo le proprietà importanti indicate). Component è un nodo di un albero e ComponentGroup è una raccolta di alberi.
public class Component
{
public Component Parent { get; set; }
public IList<Component> SubComponents { get; set; }
public ComponentGroup Group { get; set; }
}
public class ComponentGroup
{
public IList<Component> Components { get; set; }
}
Ora voglio che ogni Componente sappia a quale ComponentGroup appartiene, quindi ho bisogno di un riferimento da ogni Componente a ComponentGroup (proprietà Group). Ma ComponentGroup dovrebbe avere solo una raccolta di nodi radice (figli diretti) - Raccolta di componenti. Quindi questo è qualcosa come la mappatura a metà;) " one " side fa riferimento solo ad alcuni articoli di "molti" lato.
Hai qualche idea su come mappare qualcosa di simile usando NHibernate?
Soluzione
Ci proverò (generato con FluentNHibernate)
<class name="Component" table="`Component`" xmlns="urn:nhibernate-mapping-2.2">
<id name="ComponentId" type="Int32" column="ComponentId">
<generator class="identity" />
</id>
<many-to-one name="Parent" column="ParentId" />
<bag name="SubComponents">
<key column="ComponentId" />
<one-to-many class="NHibernateTests.Component, NHibernateTests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</bag>
<many-to-one name="Group" column="GroupId" />
<class name="ComponentGroup" table="`ComponentGroup`" xmlns="urn:nhibernate-mapping-2.2">
<id name="Id" type="Int32" column="ComponentGroupId">
<generator class="identity" />
</id>
<bag name="Components">
<key column="ComponentGroupId" />
<one-to-many class="NHibernateTests.Component, NHibernateTests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</bag>
Modifica
Se vuoi che tutti i tuoi Componenti conoscano il loro ComponentGroup, imposta su tutti loro il ComponentGroup.
E in ComponentGroup se si desidera solo tutti i componenti root, cambiare il sacchetto in:
<bag name="Components" where="ParentId is null">
in modo da ottenere solo i componenti radice