2010-06-19 5 views
0

Je suis en train de créer la classe Héritage de Table comme dans (http://www.castleproject.org/activerecord/documentation/trunk/usersguide/typehierarchy.html)Château ActiveRecord classe Héritage de Table

Alors disons que j'ai 2 classes:

[ActiveRecord("entity"), JoinedBase] 
public class Entity : ActiveRecordBase 
{ 
    private int id; 
    private string name; 
    private string type; 

    ...and properties 
} 

[ActiveRecord("entitycompany")] 
public class CompanyEntity : Entity 
{ 
    private byte company_type; 
    private int comp_id; 

    [JoinedKey("comp_id")] 
    public int CompId 
    { 
    get { return comp_id; } 
    set { comp_id = value; } 
    } 
} 

Il semble être ok, tous les tests sont bien. Une chose que je vois dans profiler et qui me rend fou est que si Entity est utilisé (c'est une propriété) dans une autre classe (appelons World), alors l'extraction des résultats World dans la jointure externe gauche sur Entity et CompanyEntity. Je m'attendrais à ce que ce soit juste une jointure sur Entity!

Quelqu'un peut-il m'aider avec cela et expliquer pourquoi cela se passe-t-il?

Répondre

2

ActiveRecord (en fait NHibernate) doit faire une jointure à gauche sur CompanyEntity car il doit savoir de quel type est réellement l'Entité. Sans se joindre à CompanyEntity, il ne peut pas savoir si c'est un CompanyEntity ou pas, donc il ne sait pas ce que instancier. En d'autres termes, sans cette jointure gauche, votre hiérarchie de classe serait rompue.

Cela ne pose pas vraiment de problèmes de performances significatifs, mais si cela vous dérange autant, essayez de passer à une autre stratégie d'héritage, comme discriminateur.

+0

bon, merci !! Impossible de passer en discriminateur car mes objets enfants reposent tous sur la même colonne du parent - je pense que cela élimine la possibilité de discriminer. – IamDeveloper

Questions connexes