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?

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top