2009-11-03 5 views
0

J'ai deux classes dont l'une hérite de l'autre. J'essaie d'utiliser NHibernate pour mapper ces classes de sorte que je puisse interroger les deux aussi efficacement que possible. La classe de base est et non Résumé et doit pouvoir être interrogée dans son propre droit. La classe de base ressemble à ceci.Requête NHibernate baseclass sans jointures à gauche aux classes dérivées

public class Cat 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

la classe dérivée ressemble à quelque chose comme ceci:

public class CustomerCat : Cat 
{ 
    public int CustomerId { get; set; } 
} 

simple dérivé étend la base et ajoute plus de propriétés à elle. Mon fichier de mappage ressemble à ce

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
        assembly="Foo" 
        namespace="Foo"> 
    <class name="Cat" table="Cat"> 
    <id name="Id" column="CatId" type="Int32" unsaved-value="0"> 
     <generator class="native" /> 
    </id> 
    <property name="Name" column="CatName" type="string" /> 
    <joined-subclass name="CustomerCat" table="CustomerCat"> 
     <key column="CatId" /> 
     <property name="CustomerId " column="CustomerId" /> 
    </joined-subclass> 
    </class> 
</hibernate-mapping> 

Le problème Im avoir est de savoir si je fais une recherche pour les chats par quelque chose comme ceci:

IList<Cat> cats = session.CreateCriteria<Cat>().List<Cat>(); 

Le produit sera laissé sql rejoindre par table jointe sous-classe. Puis-je interroger ma classe de base sans aucune référence aux tables de classes dérivées dans la requête?

Répondre

2

Je pense que pour travailler comme vous le souhaitez (c'est-à-dire ne pas toujours faire une jointure à gauche), vous devez créer une classe de base abstraite. Le problème est que tous les CustomerCats sont des Cats et qu'il devra donc se joindre à cette table pour obtenir tous les Cats (c'est-à-dire, Cats et CustomerCats).

Si vous décidez de créer une classe de base abstraite, voir here pour un aperçu des différentes options et ce que SQL qu'ils entraînent.

Questions connexes