2009-11-25 9 views
2

J'essaie de faire ce qui suit, mais il se plaint que les "classes référencées par 'extends' n'ont pas été trouvées". Je pense que je dois avoir une correspondance pour chaque type de béton de composants, mais je ne peux pas préciser le Attributes.Class deux fois ..Mappage de classes génériques en utilisant NHibernate

Le code est le suivant:

[NHibernate.Mapping.Attributes.Class(Table = "Components", Abstract = true, 
    NameType = typeof (Component<ContentItem>))] 
public abstract class Component<T> : IComponent<T> where T : ContentItem 
{ 
    ... 
} 

[NHibernate.Mapping.Attributes.JoinedSubclass(Table = "ComponentA", ExtendsType = typeof(Component<ItemA>))] 
public class ComponentA : Component<ItemA> 
{ 
    ... 
} 

[NHibernate.Mapping.Attributes.JoinedSubclass(Table = "ComponentB", ExtendsType = typeof(Component<ItemB>))] 
public class ComponentB : Component<ItemB> 
{ 
    ... 
} 

Où Itema et elementB héritent de ContentItem et sont tous mappés.

Répondre

2

Vous ne pouvez pas mapper un type générique ouvert comme celui-ci, c'est-à-dire celui qui a un paramètre de type non spécifié <T>. Ça ne marche tout simplement pas.

Ayende en parle dans more detail on his blog.

+0

Si je suis cet article et code les informations dans le fichier Component'1.hbm.xml, il semble fonctionner correctement. Je ne sais pas comment le faire en utilisant l'annotation Mapping.Attributes. De manière gênante, T n'est pas réellement mappé dans les classes car il n'est pas conservé par la base de données dans cette instance. – LucyB

+1

Il semble donc que la propriété persistante du composant ne dépend pas réellement de T. Si c'est le cas, séparez-les dans une ComponentBase (qui est mappée), le composant dérive de ComponentBase (qui n'est pas mappé), puis votre classe de composant mappée en tant que sous-classe jointe de ComponentBase. –

+0

Oui, c'est ce que j'ai fini par faire à la fin. Merci de votre aide. – LucyB