7

Tengo un objeto de entidad llamado Patient y esta entidad tiene una propiedad llamada Visits que es del tipo VisitsCollection.NHibernate colección personalizada tipo

VisitsCollections es una clase hija de IList<Visit> pero también agrega algo de lógica personalizada a la colección (como auto ordenamiento, algunas validaciones, notificaciones, etc.).

I necesita para usar el tipo de colección personalizada, ya que agrega algunos datos a las entidades que se agregan a la colección y realiza algunos otros trámites de forma transparente.

Ahora quiero que mapear en NHibernate, por lo que he creado:

<list name="Visits" lazy="true" fetch="select"> 
    <key foreign-key="PatientId" /> 
    <index column="Timestamp" /> 
    <one-to-many class="Visit" not-found="ignore"/> 
</list> 

me estoy haciendo una excepción:

No se puede convertir objeto de tipo 'NHibernate.Collection. PersistentList 'para escribir' ... VisitsCollection '

Siempre que acceda a la propiedad de visitas.

También he intentado hacer un mapa de esta manera:

<list name="Visits" lazy="true" fetch="select" collection-type="VisitsCollection"> 
    <key foreign-key="PatientId" /> 
    <index column="Timestamp" /> 
    <one-to-many class="Visit" not-found="ignore"/> 
</list> 

pero aún así, estoy recibiendo esta excepción:

tipo personalizado no implementa UserCollectionType: ..... VisitsCollection

no quiero heredar mi VisitsCollection de cualquier tipo NHibernate como la clase de colección es parte de un marco que yo quiero que sea DAL-Agnos tic (como se usará en muchos escenarios, no solo con una base de datos).

¿Alguna idea sobre cómo mapear esto, preservando la estructura de mi código?

Gracias de antemano.

Respuesta

6

Nunca uso tipos de colección personalizados, principalmente porque soy flojo. NHibernate quiere que use un IUserCollectionType, creo, que requiere un poco de plomería.

En lugar de eso, mi primera parada sería considerar el uso de métodos de extensión como discussed by Billly McCafferty. Pero tiene un código escrito así ...

Alternativamente, podría asignar su colección como un componente como discussed here by Colin Jack. Esto podría ser más fácil para su escenario?

También verifique esto SO thread.

1

También voto de no usar colecciones personalizadas. De todos modos, puedes hacerlo a través del componente.

<component name="Warehouses" class="Core.Domain.Collections.EntitySet`1[Core.Domain.OrgStructure.IWarehouseEntity,Core],Core"> 
<set name="_internalCollection" table="`WAREHOUSE`" cascade="save-update" access="field" generic="true" lazy="true" > 
    <key column="`WarehouseOrgId`" foreign-key="FK_OrgWarehouse" /> 
    <!--This is used to set the type of the collection items--> 
    <one-to-many class="Domain.Model.OrgStructure.WarehouseEntity,Domain"/> 
</set> 

How to map NHibernate custom collection with fluentNHibernate?

0

Sólo como referencia, aquí es cómo se puede hacerlo utilizando FluentNHibernate

Ya sea que debe o no debe crear un tipo de colección personalizada es un tema aparte en mi humilde opinión

public class PatientOverride : IAutoMappingOverride<Patient> 
{ 
     public void Override(AutoMapping<Patient> mapping) 
     { 
      mapping.Component(
       x => x.Visits, 
       part => 
       { 
        part.HasMany(Reveal.Member<VisitsCollection, IEnumerable<Visit>>("backingFieldName")) // this is the backing field name for collection inside the VisitsCollection class 
        .KeyColumn("PatientId") 
        .Inverse(); // depends on your use case whether you need it or not 
       }); 
     } 
} 
Cuestiones relacionadas