2010-12-10 6 views
0

Haftungsausschluss: Ich bin relativ neu zu NH & ORM im Allgemeinen.Optional SubclassMap (links verbinden) mit NHibernate 3.0 GA & FNH

Haftungsausschluss: Ich arbeite mit einem Build von FNH von here, um mit NH3.0GA zu verwenden.

Das Problem auf den Punkt ist, dass ich FNH die SubclassMap als eine Möglichkeit nutzen möchten einen LEFT JOIN, Tabelle pro Unterklasse Szenario meine Objekthierarchie abzubilden, die wie folgt definiert ist: Diese

public class MyBaseClass { 
    public virtual int Id { get; set; }  
} 

public class MySubClass : MyBaseClass { 
    public virtual string SubClassVal { get; set; } 
} 

wird über FNH wie abgebildet:

public class MyBaseClassMap : ClassMap<MyBaseClass> { 
    public MyBaseClassMap() { 
     Table("BaseClass"); 
     Id(x => x.Id, "Id").GeneratedBy.Assigned(); 
    }   
} 

public class MySubClassMap : SubclassMap<MySubClass> { 
    public MySubClassMap() { 
     Table("SubClass"); 
     KeyColumn("Id"); 
     Map(x => x.SubClassVal); 
    } 
} 

Und ich abrufen über:

public class Repository { 
    ISession session; //assume properly initialized ISession 
    public IList<T> GetAll<T>() where T: class { 
     return session.CreateCriteria<T>().List<T>(); 
    } 
} 

Und in meiner Datenbank habe ich 1 Datensatz in meiner BaseClass Tabelle, 0 Datensätze in SubClass.

Nun, was ich möchte das Unternehmen aus als MySubClass Instanz zu tun ist, zieht durch so etwas wie dies zu tun:

var rep = new Repository(); 
var subclasses = rep.GetAll<MySubClass>(); 

Und natürlich gibt es keine Instanzen in der zurückgegebenen Auflistung, da dies vermutlich einen INNEREN JOIN unter all dem durchführen. Hier stecke ich fest. Ich habe festgestellt, dass die Angabe einer "optionalen" Join ist, was ich angenommen zu tun habe. Ich habe versucht, zu modifizieren MySubClassMap zu:

public class MySubClassMap : SubclassMap<MySubClass> { 
    public MySubClassMap() { 
     Join("SubClass", j => { 
      j.KeyColumn("Id"); 
      j.Optional(); 
      j.Map(x => x.SubClassVal); // note that I've tried the map outside the Join() below, to no avail 
     }); 
     //Map(x => x.SubClassVal); 
    } 
} 

Compilieren/das Laufen präsentiert mich mit der folgenden (innerste) Ausnahme:

Das Element 'Joined-Unterklasse' im Namensraum ‚urn: nhibernate-Mapping- 2.2 'hat ungültiges Kindelement' Join 'im Namensraum' urn: nhibernate-mapping-2.2 '. Liste der möglichen Elemente erwartet: 'Eigenschaft, Viele-zu-eins, eins-zu-eins, Komponente, dynamische Komponente, Eigenschaften, beliebig, Karte, Satz, Liste, Tasche, IDBAG, Array, primitive-Array, verbundene-Unterklasse , loader, sql-insert, sql-update, sql-delete, resultset, abfrage, sql-query 'in namespace' urn: nhibernate-mapping-2.2 '.

ich spare den Stack-Trace veröffentlichen, aber der jist davon ist:

MyApp --> 
FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory() --> 
NHibernate.Cfg.FluentConfiguration.BuildConfiguration() 

Ich denke , dass alle relevanten Informationen sind. Ich vermute, ich stoße auf eine bahnbrechende Veränderung zwischen dieser sehr neuen Version von NH und der Version von FNH, die nicht so neu ist. Aber, wie bereits erwähnt, bin ich ein Anfänger, und könnte etwas Dummes tun. Wenn das der Fall ist, würde ich es sehr schätzen, wenn jemand mir über den Kopf schlägt, was wahrscheinlich offensichtlich sein sollte.

Vielen Dank im Voraus.

Antwort

2

Entitäten haben einen Typ, der sich nicht ändert. Wenn Sie nur einen Datensatz in Ihrer BaseClass-Tabelle haben, ist und wird diese Entität immer eine MyBaseClass sein.

Wenn Entitäten ihren "Typ" ändern können, sollten Sie keine Vererbung, sondern eine Komposition verwenden.

+0

Ich dachte, ich wäre peinlich. Danke, dass du mich aussortiert hast. – Devfellow