2009-03-01 9 views
0

Jamais posé une question ici avant, je vais essayer de mettre cela aussi succinctement que possible.NHibernate un-à-plusieurs avec la sous-classe jointe

J'ai une classe Recette, qui contient des listes de trois différents types d'utilisations d'ingrédients. Ces classes héritent toutes de la base, IngredientUse. Donc, le mappage ressemble à ceci:

<class name="IngredientUse" table="IngredientUses"> 
    <id name="Id" type="Int64" column="Id"> 
     <generator class="native"/> 
    </id> 
    <!--some other properties--> 
    <property name="RecipeId" column="RecipeId"/> 
    <joined-subclass name="AdditionUse" table="AdditionUses"> 
     <key column="Id" foreign-key="FK_AdditionUses_IngredientUses"/> 
     <many-to-one name="AdditionUsed" column="AdditionUsed" class="Addition" foreign-key="FK_AdditionUses_Additions"/> 
    </joined-subclass> 
    </class> 

Le problème qui se pose ici est le RecipeId. De la recette, j'ai trois listes distinctes d'utilisations pour différents types d'ingrédients, définis comme ceci:

<bag name="AdditionsUsed" cascade="all" lazy="false"> 
    <key column="RecipeId"/> 
    <one-to-many class="AdditionUse"/> 
</bag> 

Maintenant, je suis en cours d'exécution dans des problèmes en essayant de charger ces listes. Cela a quelque chose à voir avec l'héritage. Quand je regarde le SQL généré, je vois ceci:

SELECT additionsused0_.RecipeId as RecipeId1_ 
--other columns not really important 
FROM AdditionUses additionsused0_ 
inner join IngredientUses additionsused0_1_ 
on additionsused0_.Id=additionsused0_1_.Id 
WHERE [email protected]; @p0 = '11' 

Notez que sa recherche de la RecipeId dans la sous-classe table, et non la table de base où la colonne est en fait contenue. Je sais que je pourrais juste définir un tableau séparé pour chaque type d'ingrédient, mais cela me causerait des problèmes parce qu'il y a certaines situations (c.-à-d. Prix) où je n'ai pas besoin des colonnes supplémentaires dans la table de sous-classe. charger tous les ingrédients dans la même liste à la fois. Je suis certain que je dois manquer quelque chose ici, pensé que quelqu'un de plus familier avec NHibernate sur ce site pourrait le reconnaître dès le départ.

Merci d'avance.

edit: dans le cas où je n'étais pas clair sur ce que j'essaie de faire, ce diagramme pourrait aider (excusez mon UML de mauvaise qualité, j'espère qu'il ne boue pas les eaux). Il existe également une classe de base Ingredient et les mêmes sous-types.

diagram

Répondre

1

C'est le comportement attendu, le porte-clés est le nom de la colonne dans le côté « plusieurs » que les références à la « une » ...

Créer les tables dans un document, et vous verrez que si vous voulez que votre ingrédient ait de nombreux ajouts, vous aurez besoin d'ajouter une colonne dans la table des additions.

Par ailleurs, jamais la carte directement vos ids, carte l'entité au lieu d'utiliser un grand nombre à un

+0

des thats la chose, je ne veux pas la carte à la table AdditionUse, je veux à la carte Table IngredientUse, utilisant AdditionUse comme filtre et pour plus d'informations. Je suppose que je vais devoir abandonner NHibernate, ou repenser comment mes tables sont configurées. Merci pour la réponse. – AlexCuse

+0

Non, NH doit fonctionner correctement, vous ne travaillez pas avec un modèle de domaine complexe. Vous devriez recommencer à concevoir vos objets, pas vos tables. Je ne sais pas si je comprends tout ce que vous voulez faire, mais commencez à supprimer le et le changement de la classe dans le sac à "IngredientUse". –

+0

Peut-être que je suis juste en train d'être épais, mais je ne pense pas que cela m'amènera où je veux aller. Les sous-classes de I.Use ont toutes leurs propres données et comportements spéciaux, et si je change de type de sac à I.Use, je perds tout cela. On dirait un gros sacrifice à faire pour moi, quand je pourrais facilement l'aspirer et écrire le SQL. – AlexCuse