2010-10-22 6 views
3

Je suis en train de passer des .hbm correspondances pour les correspondances fluides et avoir un problème avec la cartographie des composites ids et l'utilisation des interfacesComment mapper un ID composite avec un nhibernate fluide en utilisant une interface?

la classe se présente comme suit:

public class ClassWithCompositeId { 
    public virtual IKeyOne KeyOne { get; set; } 
    public virtual IKeyTwo KeyTwo { get; set; } 
} 

notre cartographie HBM ressemble à ceci:

<hibernate-mapping ...> 
    <class name="ClassWithCompositeId" table="t_classwithcompositeid"> 
     <composite-id>  
     <key-many-to-one name="KeyOne" column="colkeyone" class="company.namespace.boSkillBase, BL_Stammdaten" /> 
     <key-many-to-one name="KeyTwo" column="colkeytwo" class="boQualifikation" />   
     </composite-id> 
</hibernate-mapping> 

Veuillez noter que nous avons des interfaces dans la classe! Non, je suis en train de cartographier cela avec Fluent nhibernate.

Map { 
    public ClassWithCompositeIdMap() { 
     CompositeId() 
      .KeyReference(x => x.KeyOne, "colkeyone") 
      .KeyReference(x => x.KeyTwo, "colkeytwo"); 
      ... 
    } 
} 

Mais maintenant Courant génère la cartographie comme suit:

... 
<composite-id mapped="false" unsaved-value="undefined"> 
     <key-many-to-one name="KeyOne" class="company.namespace.IKeyOne, Interfaces, Version=0.1.4.3379, Culture=neutral, PublicKeyToken=null"> 
     <column name="colkeyone" /> 
     </key-many-to-one> 
     <key-many-to-one name="KeyTwo" class="company.namespace.IKeyTwo, Interfaces, Version=0.1.4.3379, Culture=neutral, PublicKeyToken=null"> 
     <column name="colkeytwo" /> 
     </key-many-to-one> 
    </composite-id> 
... 

La « classe » Attribut des points maintenant à l'interface pas à la mise en œuvre de cette interface qui se traduit par une erreur.

Comment puis-je dire à Fluent nHibernate d'utiliser une autre classe comme valeur d'attribut?

+0

Désolé, les classes boQualifikation et boSkill devrait être la mise en œuvre de IKeyOne et IKeyTwo – MoJo2600

Répondre

2

Tanks! Mais j'ai trouvé la réponse sur mon on. En fait, j'ai trouvé une fonctionnalité manquante dans nHibernate fluide. La fonctionnalité a déjà été ajoutée à la branche dev par Paul Batum.

On peut l'utiliser comme ceci:

Map { 
     public ClassWithCompositeIdMap() { 
      CompositeId() 
       .KeyReference(x => x.KeyOne, k => 
        k.Type<KeyOneImplementation>(), "colkeyone") 
       .KeyReference(x => x.KeyTwo, k => 
        k.Type<KeyTwoImplementation>(), "colkeytwo"); 
      ... 
     } 
    } 

http://github.com/paulbatum/fluent-nhibernate/tree/dev

Vous pouvez voir la conversation originale ici: http://support.fluentnhibernate.org/discussions/help/349-how-to-map-a-composite-id-when-using-interfaces-or-how-to-change-the-class-attribute-in-the-key-many-to-one-tag

3

Essayez de télécharger NhGen from SourceForge. Il lit les schémas de base de données et génère des mappages et des classes Fluent etc. Bien que tout le code ne soit pas ce dont vous avez besoin, il devrait démarrer dans la bonne direction car il prend en charge les clés composites.

Je beleive il utilise une syntaxe similaire à

CompositeId() 
      .ComponentCompositeIdentifier(x => x.Key, "Namespace.Key, Assembly") 
      .KeyProperty(x => x.Key.Id1, "Id1") 
      .KeyProperty(x => x.Key.Id2, "Id2") 
      .KeyProperty(x => x.Key.Id3, "Id3"); 
+0

NhGen sonne bien, mais il n'y a pas de fichiers sur SF :( – Cocowalla

Questions connexes