2010-04-19 5 views
2

J'ai une interface IUserLocation et un type concret UserLocation.Mappages polymorphes de NHibernate

Lorsque j'utilise ICriteria, en spécifiant l'interface IUserLocation, je veux NHibernate instancier une collection de concretsUserLocation.

J'ai créé un fichier de mappage HBM en utilisant la stratégie table per concrete type (illustrée ci-dessous). Cependant, quand je fais une recherche à l'aide de NHibernate ICriteria je reçois:

NHibernate ne peut pas instancier classe abstraite ou une interface MyNamespace.IUserLocation

Quelqu'un peut-il voir pourquoi est-ce? (Code source pour le bit correspondant de NHibernate here (je pense))

Mes ICriteria:

var filter = DetachedCriteria.For<IUserLocation>() 
          .Add(Restrictions.Eq("UserId", userId)); 

return filter.GetExecutableCriteria(UoW.Session) 
      .List<IUserLocation>(); 

Mon fichier de mapping:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="true"> 
    <class xmlns="urn:nhibernate-mapping-2.2" name="MyNamespace.IUserLocation,MyAssembly" abstract="true" table="IUserLocations"> 
    <composite-id> 
     <key-property name="UserId" column="UserId" type="System.Guid"></key-property> 
     <key-many-to-one name="Location" column="LocationId" class="MyNamespace.ILocation,MyAssembly"></key-many-to-one> 
    </composite-id> 
    <union-subclass table="UserLocations" name="MyNamespace2.UserLocation,MyAssembly2"> 
     <property name="IsAdmin" /> 
    </union-subclass>  
    </class> 
</hibernate-mapping> 

Répondre

3

De la documentation, il ressemble à votre fichier de mappage devrait fais le pour moi. Cependant, je n'ai jamais essayé de table par classe concrète. Et je remarque les exemples dans le NHibernate documentation car il n'utilise pas d'interfaces pour la classe de base. Peut-être que ce n'est pas supporté?

J'ai déjà utilisé Table per concrete class, using implicit polymorphism avec un mappage séparé pour chaque sous-classe.

<class name="MyNamespace.UserLocation,MyAssembly" table="UserLocations"> 
    ... 
</class> 
+0

Merci David. Il m'apparaît que je peux aboyer le mauvais arbre, car j'essaie d'utiliser NHibernate un peu comme un conteneur IOC ici, en instanciant un type concret où je ne fournis qu'une interface. Si NHibernate le supporte, je pense que ce serait très utile. En raison des limitations de la solution que je suis en train de travailler, il est impossible de modifier l'interface pour qu'elle soit une classe de base abstraite. Comme un piratage temporaire, j'utilise le conteneur IOC pour résoudre le type concret de l'interface à fournir à ICriteria. – Ben

+1

J'ai recommencé à regarder cela et j'ai remarqué que si le fichier de mappage utilise UserLocation au lieu de IUserLocation et que la sous-classe union est supprimée, vous pouvez toujours le référencer comme IUserLocation dans les critères et récupérer un IList . –