2009-06-12 21 views
27

De modo que todo funciona bien con el mapeo discriminador básico. Puedo interactuar directamente con las entidades A y B sin ningún problema.Entidad fluida NHibernate HasMany colecciones de diferentes tipos de subclase

public class BaseType {} 
public class EntityA : BaseType {} 
public class EntityB : BaseType {} 

Esta Mapas sin drama en el mapeo BaseType como

DiscriminateSubClassesOnColumn<string>("Type") 
       .SubClass<BaseType>("A", m => { }) 
       .SubClass<BaseType>("B", m => { }); 

El problema se produce cuando: en un agregado que queremos mapear colecciones para cada subclase

a través de cartografía, como a continuación

public class AggregateMap: BaseMap<Aggregate> 
{ 
     public AggregateMap() 
     { 
       HasMany<EntityA>(x => x.ACollection).AsSet().Cascade.All(); 
       HasMany<EntityB>(x => x.BCollection).AsSet().Cascade.All();    
     } 
} 

obviamente no son mapeos completos, pero son la cantidad mínima para descifrar lo que estoy intentando. Los elementos agregados a ACollection y BCollection se conservan correctamente a través de la cascada cuando se guarda Agregado. Sin embargo, cuando se recupera el agregado, hay confusión sobre la discriminación de tipo.

He corrido tantas soluciones posibles diferentes que ya no sé lo que no funcionó. Siento que no debería tener que proporcionar una cláusula WHERE en las colecciones, pero las cosas simplemente no funcionan para mí.

Cualquier pista sería apreciada.

+0

Por "confusión sobre la discriminación de tipo", ¿quiere decir que ambos conjuntos están devolviendo todos los tipos? Independientemente de su discriminador? –

+0

Me queda trabajo ahora, así que no puedo recordar el error exacto. Algo así como 'No se pudo cargar la entidad del tipo EntityA porque no coincide con la EntityB especificada'. Hemos hackeado una cláusula Where usando una cadena en la asignación HasMany y que se está filtrando manualmente a través de la columna de discriminador. Solo pensé que el tipo 'fluiría' y la decisión donde se realizaría automáticamente. – berko

+0

Y sí, para responder a su pregunta directamente ... Creo que está intentando cargar todos los tipos independientemente del discriminador. – berko

Respuesta

1

Usted mapeo parece extraño, en particular, creo que debe ser más como esto

DiscriminateSubClassesOnColumn<string>("Type") 
       .SubClass<EntityA>("A", m => { }) 
       .SubClass<EntityB>("B", m => { }); 

Una vez dicho esto parece se deprecia ese método y en su lugar debe definir lo siguiente (tomado de Automapping Subclasses:

public class ParentMap : ClassMap<Parent> 
{ 
    public ParentMap() 
    { 
    Id(x => x.Id); 
    Map(x => x.Name); 

    DiscriminateSubClassesOnColumn("type"); 
    } 
} 

public class ChildMap : SubclassMap<Child> 
{ 
    public ChildMap() 
    { 
    Map(x => x.AnotherProperty); 
    } 
} 

No estoy seguro que lo arreglará sin embargo, sin embargo, estoy a encontrarse con su escenario.

Editar: El problema también se plantea here, sonando más como un error para mí

Cuestiones relacionadas