2009-05-12 9 views
5

J'ai une table appelée "Orderrow". Orderrow a une clé primaire composée (CPK) avec les colonnes suivantes: OrderId, ProductId, RowNumberMappage des clés primaires multiples NHibernate

OrderId et ProductId sont également des clés étrangères faisant référence aux tables Order et Product. Le RowNumber est généré dans l'application.

Je me demandais comment cela est mappé dans NHibernate parce que je ne peux définir que 1 élément id et 1 sous-élément de générateur.

Répondre

6

Il existe une propriété 'composite-id' que vous pouvez utiliser dans votre mapping de classe au lieu de la propriété 'id'. Cependant, sachez que l'équipe nHibernate déconseille fortement son utilisation. Il semble que vous ayez affaire à une base de données existante, dans laquelle vous n'avez aucun contrôle sur le schéma. Ainsi, le 'composite-id' est spécifiquement pour votre situation.

Vérifiez les NH docs pour plus d'informations: http://nhibernate.info/doc/nh/en/index.html

+0

Je l'ai lu aussi dans l'API ref NHibernate. Mais je n'ai pas de base de données "legacy", juste une base de données à des fins de recherche, donc je peux facilement changer la table Orderrow ici. Alors quelle est la meilleure option préférée dans la conception de la table alors? Dois-je créer 1 clé primaire sur la table Orderrow qui est unique par ligne? –

+0

Oui. Une seule colonne unique pour le primaire est préférable. – NathanD

0

Personnellement, je n'aime pas avoir les clés primaires composées dans mes schémas table de base de données, plus ils sont généralement « dur » à manipuler par un cartographe ORM j'ai essayé. Si je dois donner une identité unique à une ligne dans une table (en particulier si elle représente un objet métier), je préfère utiliser un ID de substitution de valeur unique - un GUID ou un Integer - si l'un des champs de la table est ne convient pas. L'utilisation d'un Id composite est toujours gênante lors de l'écriture de requêtes et de jointures d'interrogation. Ma stratégie habituelle consiste donc à utiliser un Id de substitution (qui n'a aucun sens pour l'objet métier mais à identifier l'objet) et à placer une contrainte unique le précédent CPK.

9

Voici un exemple en utilisant la propriété composite id dans un fichier de mappage NHibernate:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Domain" namespace="Domain.Model"> 

    <class name="Program" table="program"> 
    <composite-id> 
     <key-property name="Id" column="id"></key-property> 
     <key-property name="Prog" column="prog"></key-property> 
     <key-property name="Site" column="site"></key-property> 
    </composite-id> 
    <property name="ActiveDate" column="active_date"/> 
    <property name="Year" column="year"/> 
    </class> 

</hibernate-mapping> 
Questions connexes