2009-06-12 7 views
27

Tout fonctionne donc bien avec le mappage discriminateur de base. Je peux interagir directement avec les entités A et B sans aucun problème.Entité NHibernate fluide HasMany collections de différents types de sous-classes

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

Mappe sans drame dans la cartographie BaseType comme

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

Le problème se produit lorsque: dans un ensemble que nous voulons cartographier les collections à chaque sous-classe

En utilisant la cartographie comme ci-dessous

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

Ces évidemment mais ne sont pas le montant minimum pour décrire ce que je tente. Les éléments ajoutés à ACollection et BCollection sont conservés correctement dans la cascade lorsque l'agrégat est enregistré. Cependant, lorsque l'agrégat est récupéré, il y a confusion sur la discrimination de type.

J'ai parcouru tant de solutions différentes possibles que je ne sais plus ce qui n'a pas fonctionné. Je pense que je ne devrais pas avoir à fournir une clause Where sur les collections, mais les choses ne fonctionnent tout simplement pas pour moi.

Des indices seraient appréciés.

+0

Par "confusion sur la discrimination de type", voulez-vous dire que les deux ensembles retournent tous les types? Indépendamment de leur discriminateur? –

+0

J'ai quitté le travail maintenant, donc je ne me souviens pas de l'erreur exacte. Quelque chose comme 'Impossible de charger l'entité de type EntityA car elle ne correspond pas à EntityB' spécifiée. Nous avons piraté une clause Where en utilisant une chaîne sur le mappage HasMany et qui filtre manuellement via la colonne discriminante. Je pensais juste que le type «passerait» et que la décision serait prise automatiquement. – berko

+0

Et oui, pour répondre à votre question directement ... Je pense qu'il tente de charger tous les types quel que soit le discriminateur. – berko

Répondre

1

mapping Vous semble étrange, en particulier, je pense qu'il devrait ressembler plus comme celui-ci

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

Cela dit, il semble que la méthode est dépréciée et vous devriez plutôt définir les éléments suivants (pris 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); 
    } 
} 

Pas sûr que cela va corriger bien, je suis encore à rencontrer votre scénario.

Modifier: Le problème est également soulevé here, sonnant plus comme un bug pour moi

Questions connexes