Germán Schuager | 18 Aug 22:52

Propiedad ISet<> de solo lectura


Buenas gente, quería ver si me pueden aclarar la siguiente duda.
Estoy implementando un modelo jerarquico con NH donde tengo varias
Categorías y cada una de estas puede terner otras Categorías anidadas.

La clase Categoria es algo así:

public class Categoria {

	private ISet<Categoria> children;

	public Categoria()
	{
		children = new HashedSet<Categoria>();
	}

	public virtual int ID { get; private set; }
	public virtual string Nombre { get; set; }
	public virtual Categoria Parent { get; private set; }

	public virtual ISet<Categoria> Children
	{
		get { return new ImmutableSet<Categoria>(children); }
		private set { children = value; }
	}

	public virtual void AddChild(Categoria categoria) { ... }

	public virtual void RemoveChild(Categoria categoria) { ... }

}

El mapeo de esta clase es el siguiente:

  <class name="Categoria" table="Categoria">
    <id name="ID" column="CategoriaID" type="Int32" unsaved-value="0">
      <generator class="identity" />
    </id>
    <property name="Descripcion" column="Descripcion" type="String"
length="100" />
    <many-to-one name="Parent" column="ParentCategoriaID"
lazy="false" />
    <set name="Children" cascade="all" lazy="false">
      <key column="ParentCategoriaID" />
      <one-to-many class="XYZ.Core.Entities.Categoria, XYZ.Core,
Version=0.1.0.30, Culture=neutral, PublicKeyToken=null" />
    </set>
  </class>

Como se ve, las propiedades Parent y Children son de solo lectura para
los clientes de la clase y solo se pueden modificar mediante llamadas
a AddChild y RemoveChild, el problema surge en que al persistir una
categoría usando NH, la propiedad children (que inicialmente era de
tipo HashedSet) se transforma en una instancia de PersistentGenericSet
que encapsula una instancia de ImmutableSet, por lo tanto, mi campo
privado children se vuelve de solo lectura, y cuando quiero usar el
método AddChild tira una excepción.

Alguien me puede explicar como puedo brindar acceso de solo lectura al
campo children y no tener este problema.

Una de las opciones que se me ocurrió es mapear directamente el campo
y no la propiedad, pero todavía no la he probado... hay alguna forma
de hacerlo mapeando la propiedad?

Desde ya, muchas gracias.

Saludos.

Germán Schuager
http://gschuager.blogspot.com
--~--~---------~--~----~------------~-------~--~----~
Para escribir al Grupo, hágalo a esta dirección: NHibernate-Hispano <at> googlegroups.com
Para más, visite: http://groups.google.com/group/NHibernate-Hispano
-~----------~----~----~----~------~----~------~--~---


Gmane