2008-11-25 6 views
8

Ich versuche, ein Verbunden-Unterklasse-Szenario mit Fluent NHibernate zuzuordnen. Ich habe eine Klasse Entity im Namensraum Kern definiert, und eine Klasse SubClass: Entity im Namensraum SomeFließende NHibernate, Joined-Subclass Mapping

Jetzt habe ich natürlich nicht Klasse Entity wollen über die davon abgeleiteten Typen kennen, die SomeModules Namespace Referenzen Kern - nicht anders herum herum.

Alle Beispiele, die ich habe in der Lage gewesen, wie Einsatz, etwas zu finden:

public class EntityMap : ClassMap<Entity> { 
    public EntityMap() { 
     Id(x => x.Id) 

     var subClassMap = JoinedSubClass<SubClass>("SubClassId", sub => sub.Map(x => x.Id)); 

     subClassMap.Map(x => x.SomeProperty) 
     ... 
    } 
} 

Diese einfach nicht in meiner Situation arbeiten - ich brauche so etwas wie das NHibernate XML-Mapping:

<joined-subclass name="SubClass" extends="Entity, Core" > 
<key column="SubClassId" foreign-key="FK_KollegiumEntity"/> 
<property name="Name" length="255" not-null="true" /> 
... 
</joined-subclass> 

Hat jemand dies mit Fluent NHibernate erreicht?

Antwort

0

Hallo habe so etwas vor ein paar Tagen gemacht.

public class EntityMap : ClassMap<Entity> { 
public EntityMap() { 
    Id(x => x.Id) 

    JoinedSubClass<SubClass>("SubClassId", sub => { 
      sub.Map(x => x.Name); 
      sub.Map(x => x.SomeProperty); 
    }); 
} 
} 

Hoffe, dass es

+1

Ihre vorgeschlagene Lösung löst nicht mein Problem, nämlich die Zuordnungen von Entity und SubClass zu trennen. –

0

Magnus hilft, ich war genau die gleiche Art von Problem haben, und Ihren Vorschlag sortiert sie.

Der zweite Parameter von JoinedSubClass übernimmt eine SubClassPart-Aktion für Ihr Objekt vom Typ SubT. Daher müssen Sie nur die zusätzlichen Felder auf Ihrem Unterklasse-Objekt zuordnen.

Das vorherige Beispiel bildet eine ID ab, also nehme ich an, dass eine andere ID als der Wert ist, dem die Basis und die Unterklasse beitreten, sonst würden Sie SqlParameterCollection-Fehler sehen.

1

Leider verpassten Ihren Kommentar, fanden diese

public class SubClassMap : JoinedSubClassPart<SubClass> 
{ 
    public SubClassMap() 
     : base("SubClassId") 
    { 
     Map(x => x.Name); 
     Map(x => x.SomeProperty); 
    } 
} 

Hoffe, dass es hilft, wenn man es schon nicht gelöst haben.

1

Magnus (oder Preis),

Haben Sie herausfinden, wie in der übergeordneten Mapping-Klasse, das letzte Beispiel zu benutzen? Dieser arbeitete für mich, aber ich weiß nicht wie die SubClassMap selbst instanziieren:

public class EntityMap : ClassMap<Entity> { 
public EntityMap() { 
    Id(x => x.Id) 
    AddPart(new SubClassMap()); // Adds the subclass mapping! 
} 
} 

public class SubClassMap : JoinedSubClassPart<SubClass> 
{ 
    public SubClassMap() 
     : base("SubClassId") 
    { 
     Map(x => x.Name); 
     Map(x => x.SomeProperty); 
    } 
} 

, die eine Abfrage wie produziert:

SELECT 
    this_.Id as Id2_2 
    this_.Name as Name3_2 
    this_.SomeProperty as SomeProperty3_2 
FROM 
    SubClass this_ inner join 
    Entity this_1 on this_.Id=this_1.Id 
+4

Scheint Add Part ist jetzt Obsolete ...? – 5x1llz

10

Ich denke, die API, da diese Frage gestellt wurde geändert, aber das funktioniert für mich:

public class SomeSubclassMap : SubclassMap<SomeSubclass> { 
    public SomeSubclassMap() 
    { 
     KeyColumn("SomeKeyColumnID"); 
     Map(x => x.SomeSubClassProperty); 
     ... 
    } 
} 

ich glaube KeyColumn nur, wenn es anders als ‚Baseclassname_id‘

erforderlich ist

Hinweis: Es sollte auch eine ClassMap<SomeBaseClass> für die Basisklasse geben, die SomeSubClass erweitert.

+0

+1 für Ihre nette Antwort.Haben Sie eine Idee, Fluent NHibernate mitzuteilen, dass "KeyColumn" mit der Spalte "XYZ" in der Basisklassentabelle verknüpft werden soll, NICHT mit der Primärschlüsselspalte? –

+0

@Milan: Ich sehe das nur, Entschuldigung für die langsame Antwort. Mir ist nicht bekannt, wie ich eine andere KeyColumn auf der Seite der Basisklasse angeben kann. Die KeyColumn-Eigenschaft bedeutet nur die Primärschlüsselspalte der Eltern/Basis. Ich habe mir die Dokumente angesehen, nur für den Fall, dass ich etwas falsch verstanden habe. –

+0

@MilanGardian hast du jemals eine Antwort auf deine Frage gefunden? Kann eine Unterklasse zurück zu ihrem Elternteil mappen, aber ohne die Eltern-ID-Spalte verwenden? – ahsteele