2009-03-12 12 views
0

Je ne suis pas sûr si c'est un problème avec ma configuration Fluent ou une logique dans ma pensée.Fluent nHibernate et JoinSubClasses

Fondamentalement, j'ai une classe Person à partir de laquelle j'ai deux classes héritées, Auteur et Emprunteur (c'est un système de bibliothèque). La cartographie que j'ai est.

public class PersonMap : ClassMap<Person> 
{ 
    public PersonMap() 
    { 
     Id(x => x.Id, "id"); 
     Map(x => x.Name, "name"); 

     // Subclasses 
     AddPart(new AuthorMap()); 
     AddPart(new BorrowerMap()); 
    } 
} 

public class AuthorMap : JoinedSubClassPart<Author> 
{ 
    public AuthorMap() : base("person_id") 
    { 
     Map(x => x.Country, "country"); 
     HasMany(x => x.Books).Cascade.All().WithKeyColumn("book_id"); 
    } 
} 

public class BorrowerMap : JoinedSubClassPart<Borrower> 
{ 
    public BorrowerMap() : base("person_id") 
    { 
     Map(x => x.UserName, "user_name"); 
     HasMany(x => x.Schedule).Cascade.SaveUpdate().WithKeyColumn("borrower_id"); 
    } 
} 

Maintenant, si je lance le HQL « de l'auteur d'une ORDER BY a.Name » il renvoie une liste de toutes les entités de l'auteur et de l'emprunteur où je veux juste évidemment une liste d'auteurs. S'il vous plaît, n'hésitez pas à me mettre directement sur ce sujet.

Répondre

0

Quelques choses à essayer:

  • Dans chacune des cartes de sous-classe, définissez le nom de table avec WithTableName("Author")
  • est person_id la colonne de clé sur chaque table de la sous-classe? Dans le cas contraire, changer base("person_id") à base("key column name")

Par exemple, je viens de tester une requête très similaire avec les applications suivantes:

public class DigitalFreeSubscriptionMap : JoinedSubClassPart<DigitalFreeSubscription> 
{ 
    public DigitalFreeSubscriptionMap() 
     : base("DigitalFreeSubscriptions") 
    { 
     WithTableName("DigitalFreeSubscriptions"); 
     ... 

et

public class FreeSubscriptionMap : JoinedSubClassPart<FreeSubscription> 
{ 
    public FreeSubscriptionMap() 
     : base("FreeSubscriptions") 
    { 
     WithTableName("FreeSubscriptions"); 
     ... 

Les deux sont sous-classes de Subscription. Dans la base de données que j'ai testé il y a 1700 DigitalFreeSubscriptions alors qu'il y a plus d'un million de FreeSubscripions (et d'autres types d'abonnements). La requête HQL "FROM DigitalFreeSubscripion" a donné 1700 résultats.

par demande, en haut de la SubscriptionMap:

public class SubscriptionMap : AuditableClassMap<Subscription> 
{ 
    public SubscriptionMap() 
    { 
     WithTable("Subscriptions"); 
     Id(x => x.Id, "Subscriptions"); 

     AddPart(new FreeSubscriptionMap()); 
     AddPart(new DigitalFreeSubscriptionMap()); 
     // More sublass mappings and then the field mappings