NHibernate - como mapear la colección de árboles
-
10-07-2019 - |
Pregunta
Quiero asignar mi modelo de objeto a NHibernate. Hay una parte difícil en mi concepto y no sé si es posible hacerlo en NHibernate.
Quiero tener una colección de árboles. Tengo dos clases (a continuación, solo se indican propiedades importantes). Component es un nodo de un árbol y ComponentGroup es una colección de árboles.
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; }
}
Ahora quiero que cada Componente sepa a qué ComponentGroup pertenece, así que necesito referencia de cada Componente a ComponentGroup (propiedad de Grupo). Pero ComponentGroup solo debe tener una colección de nodos raíz (hijos directos) - Colección de componentes. Así que esto es algo así como el mapeo de uno a la mitad;) " uno " el lado tiene referencia solo a algunos elementos de " muchos " lado.
¿Tienes alguna idea de cómo mapear algo como esto usando NHibernate?
Solución
Lo intentaré (generado 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>
EDIT:
Si desea que todos sus Componentes conozcan su Grupo de componentes, configure en todos ellos el Grupo de componentes.
Y en ComponentGroup si solo desea todos los componentes raíz, cambie la bolsa a:
<bag name="Components" where="ParentId is null">
para que solo obtenga los componentes raíz