2010-11-19 4 views
0

Je rencontre un problème de mappage d'une relation plusieurs-à-un d'un mappage de classe de base abstrait vers une union-sous-classe concrète. Exemple:Mappage des relations plusieurs-à-un de NHibernate de classes de base abstraites à union-sous-classes

public abstract class Entity 
{ 
    public virtual Guid ID {get; set;} 
    public virtual string Name {get;set;} 
    public virtual User OwnerUser {get; set;} 
} 

public class User : Entity 
{ 
    public virtual string UserName {get; set;} 
} 

Comme vous pouvez le voir ici, j'ai une classe abstraite de base pour tous mes objets de base de données. Je mappe ces classes avec la classe Entity en tant que classe de mappage abstrait et l'utilisateur en tant que sous-classe union. Lors de la création de l'objet de configuration, aucune erreur n'est levée et le schéma exporte correctement. Cependant, le champ de l'utilisateur propriétaire ne s'affichera pas dans la base de données pour toutes les classes concrètes. Voici un exemple de l'apparence du mappage

<class entity-name="Entity" name="Entity" abstract="true"> 
    <id name="ID" type="guid"> 
     <generator class="guid.comb"/> 
    </id> 
    <property name="Name" /> 
    <many-to-one name="OwnerUser" column="ID" entity-name="User" /> 
</class> 

<union-subclass name="User" entity-name="User" extends="Entity"> 
    <property name="UserName" /> 
</union-subclass> 

J'utilise également une instance Oracle XE en tant que backend de base de données. Si ce n'est pas assez d'informations pour répondre correctement à la question, faites le moi savoir et je vais ajouter ce que je peux.

Dans le pire des cas Je vais ajouter explicitement la relation plusieurs-à-un sur tous les objets concrets, mais ce n'est pas la solution la plus élégante et je pense que ce que j'ai proposé devrait fonctionner. J'ai été incapable de trouver des exemples concrets de ceci sur les tubes qui alimentent les différents internets, et je n'ai rien trouvé dans la documentation expliquant explicitement que c'est un cas d'utilisation invalide, bien que j'aurais pu manquer quelque chose. Ce ne serait pas la première fois: -/

Toutes les réponses à cette question sont grandement appréciées. Merci pour votre temps.

Répondre

0

Wow, juste ... wow. Au lieu de tenter de supprimer ce post, je laisserai à un autre modeste nobernate de trouver un jour, car je n'ai trouvé aucune question concernant ce cas d'utilisation spécifique.

Le fait est que vous pouvez le faire sans problème. Mon problème était que je spécifiais l'ID pour l'attribut de colonne dans l'élément de mappage many-to-one. Pour une raison étrange, je pensais que c'était la colonne que la clé étrangère référençait (qui est en fait la propriété-ref, si je ne me trompe pas). Cet attribut spécifie en fait le nom de la colonne dans la table qui contient la référence (d'oh!). Étonnamment, NHibernate va heureusement associer plusieurs éléments de mapping au même nom de colonne sans avertissement. Je n'essaie pas de les blâmer, peut-être que le cas d'utilisation de ce type est de permettre un certain type de substitution sur une classe dérivée polymorphe.

Quoi qu'il en soit, ceci est un cas d'utilisation valide et le changement de l'attribut de la colonne au nom de la colonne dans la table de référence a bien fonctionné. Peut-être que j'ai regardé des bits et des octets pendant un peu trop longtemps chaque nuit cette semaine ... soupir.

Merci à tous ceux qui ont pris le temps de consulter ce post.

Questions connexes