2008-11-25 6 views
8

J'essaie de mapper un scénario de sous-classe jointe en utilisant NHibernate Fluent. J'ai une entité de classe définie dans l'espace de noms de base, et une classe Sous-classe: Entité dans l'espace de noms UnModuleFluid NHibernate, joint-subclass mapping

Maintenant, je évidemment ne veux pas de classe entité de connaître ses dérivés types, les références d'espace de noms SomeModules de base - pas l'inverse autour.

Tous les exemples que j'ai pu trouver utiliser quelque chose comme:

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) 
     ... 
    } 
} 

Ce ne fonctionnera pas dans ma situation - je besoin de quelque chose semblable à la cartographie NHibernate xml:

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

Quelqu'un a-t-il atteint cet objectif avec Fluent NHibernate?

Répondre

0

Bonjour, j'ai fait quelque chose comme ça il y a quelques jours.

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

Hope it helps

+1

Votre solution proposée ne résout pas mon problème, qui consiste à séparer les mappages d'entité et de sous-classe. –

0

Magnus, je faisais exactement le même type de problème, et votre suggestion ont réglé.

Le second paramètre de JoinedSubClass prend une action SubClassPart sur votre objet de type SubT. Il vous suffit donc de mapper les champs supplémentaires sur votre objet sous-classé. Cet exemple précédent mappine un Id, donc je devine que c'est un id différent de la valeur de la base et de la sous-classe, sinon vous commencerez à voir des erreurs SqlParameterCollection traverser.

1

votre commentaire Désolé raté, a trouvé cette

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

Hope it helps si vous ne l'avez pas résolu déjà.

1

Magnus (ou Prix),

Avez-vous savoir comment utiliser ce dernier exemple dans la classe de mapping parent? Cela a fonctionné pour moi, mais je n'aime pas instancier le SubClassMap moi-même:

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

qui a produit une requête similaire à:

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

Semble ajouter une pièce est maintenant obsolète ...? – 5x1llz

10

Je pense que l'API a été demandé a changé depuis cette question, mais fonctionne pour moi:

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

Je crois KeyColumn est uniquement nécessaire si elle est différente de « Baseclassname_id »

Remarque: Il doit également y avoir un ClassMap<SomeBaseClass> pour la classe de base étendue par SomeSubClass.

+0

+1 pour votre belle réponse.Avez-vous une idée de la manière de dire à Fluent NHibernate que "KeyColumn" doit être joint à la colonne "XYZ" dans la table des classes de base, PAS à la colonne de la clé primaire? –

+0

@Milan: Je vois juste ceci, désolé pour la réponse lente. Je ne suis pas au courant d'un moyen de spécifier un autre KeyColumn sur la classe de base side -KeyColumn signifie juste cela, la colonne clé primaire du parent/base. J'ai regardé les docs juste au cas où il y aurait quelque chose que j'ai peut-être mal compris. –

+0

@MilanGardian avez-vous déjà trouvé une réponse à votre question? Une sous-classe peut-elle correspondre à son parent, mais sans utiliser la colonne d'identification du parent? – ahsteele