2009-03-12 12 views
0

Ich bin mir nicht sicher, ob dies ein Problem mit meiner Fluent-Konfiguration oder Logik in meinem Denken ist.Fluent nHibernate und JoinSubClasses

Grundsätzlich habe ich eine Person-Klasse, von der ich zwei Klassen geerbt habe, Autor und Kreditnehmer (es ist ein Bibliothekssystem). Die Zuordnung, die ich habe, ist.

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"); 
    } 
} 

Nun, wenn ich die HQL „FROM Autor eine ORDER BY a.Name“ laufen wird eine Liste aller Autor und Borrower Einheiten zurück, wo ich natürlich wollen einfach nur eine Liste der Autoren verfügbar. Bitte zögern Sie nicht, mich darauf anzusprechen.

Antwort

0

Ein paar Dinge zu versuchen:

  • In jedem der Unterklasse Karten, stellen Sie den Tabellennamen mit WithTableName("Author")
  • Ist person_id die Schlüsselspalte auf jeder Unterklasse Tabelle? Wenn nicht, ändern base("person_id") zu base("key column name")

Zum Beispiel habe ich getestet nur eine sehr ähnliche Abfrage mit den folgenden Zuordnungen:

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

und

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

Beide sind Subklassen von Subscription. In der Datenbank, die ich getestet habe, gibt es 1700 DigitalFreeSubscriptions, während es über eine Million FreeSubscriptions (und andere Arten von Abonnements) gibt. Die HQL-Abfrage "FROM DigitalFreeSubscripion" ergab 1700 Ergebnisse.

pro Anfrage, die Oberseite des 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