2010-02-28 3 views
3

Une partie d'un modèle que je conçois est une hiérarchie géographique. Comme il existe plusieurs couches et de partager des informations, j'ai décidé d'utiliser une hiérarchie de classes comme ceci:Mixage de l'héritage et de la structure arborescente avec nHibernate fluide

public class GeographicNode 
{ 
    public virtual int Id { get; private set; } 
    public virtual string Name { get; set; } 
    public virtual GeographicNode ParentNode { get; set; } 
    public virtual IList<GeographicNode> ChildNodes { get; set; } 
} 


public class Region : GeographicNode 
{ 
    public virtual int SomeRegionData { get; set; } 
} 

public class Country : GeographicNode 
{ 
    public virtual int SomeCountryData { get; set; } 
} 

Pour mapper ce que je utilise une méthode table par hiérarchie de classe. La cartographie NHibernate Fluent ressemble à ceci:

public class GeographicNodeMap : ClassMap<GeographicNode> 
{ 
    public GeographicNodeMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.Name); 
     References(x => x.ParentNode); 
     HasMany(x => x.ChildNodes).KeyColumn("Id").Cascade.All(); 

     DiscriminateSubClassesOnColumn("Type"); 
    } 
} 

public class RegionMap : SubclassMap<Region> 
{ 
    public RegionMap() 
    { 
     Map(x => x.SomeRegionData) 
    } 
} 

public class CountryMap : SubclassMap<Region> 
{ 
    public CountryMap() 
    { 
     Map(x => x.SomeCountryData) 
    } 
} 

Voici ma question:

Quand je reçois un nœud et essayez d'accéder ParentNode (ou les enfants), son type est en fait GeographicNode, et non la sous-classe appropriée. Ainsi, par exemple, si j'obtiens un noeud Region et que son parent est supposé être un noeud Country, je ne peux pas convertir ParentNode en classe Country.

Existe-t-il un moyen de forcer nHibernate à instancier les objets ParentNode et Child avec leur sous-classe appropriée? Ces informations sont stockées dans la colonne Type, il semble donc raisonnable pour nHibernate d'instancier la sous-classe correcte.

Y a-t-il des problèmes majeurs avec l'utilisation de l'héritage ici? Utiliser une hiérarchie de classe réduit la quantité de code (au moins dans le modèle), mais je crains que ces relations implicites plutôt qu'explicites (par exemple, le parent d'une région soit toujours un pays) puissent me causer des problèmes plus tard.

Merci!

+0

Pour tous ceux qui s'en soucient: L'héritage semble être géré correctement dans ActiveRecord, c'est-à-dire que les nœuds parents/enfants sont instanciés avec la sous-classe correcte et peuvent être Avant d'être casté correctement. –

Répondre

0

depuis mappée comme NHibernate de référence normale ne peut pas connaître le type withoput chargement du parent, alors quand lazyloading le parent, il ne connaît pas son type et crée un proxy de la classe de base. Deux options pour remédier à cette:

  • désactiver Lazyloading de la référence: References(x => x.ParentNode).Not.LazyLoad();
  • magasin le type de parent dans le dossier de l'enfant: ReferenceAny<(x => x.ParentNode).TypeColumn("parenttype")... puis NH va créer le proxy correct

je serais en faveur de option 1 car elle est facile et ne signifie généralement pas grand chose à la performance

Questions connexes