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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top