2009-10-27 4 views
4

J'ai une cartographie NHibernate pour une classe de base ANHibernate saveOrUpdate, erreur: Non persister pour

class A 
{ 
} 

class B : A 
{ 
} 

public save(A a) 
{ 
session.SaveOrUpdate(a); 
} 

d'erreur: Non persister B

Comme vous pouvez le voir B a été passé avec la base correcte tapez A, mais je reçois toujours l'erreur sur le persister pour le type B

Est-ce que NHibernate prend en charge l'héritage comme ça ... que puis-je faire?

Répondre

9

Mise à jour: réécrite réponse

Apparemment, bien que je ne parviens pas à trouver la source définitive sur ce point, est la classe réelle importante. Cela a du sens, si vous considérez que NHibernate utilise la réflexion pour trouver le type sous-jacent. En outre, lorsque le mapping est chargé, il décore vos types, donc fondamentalement ils deviennent des types complètement différents (vous pouvez le voir quand vous passez la souris dessus pendant le débogage).

Ce principe empêche fondamentalement le mapping de downcast d'héritage, puisque votre type dérivé n'est pas mappé, il n'est pas décoré et n'est donc pas connu. Si vous devez utiliser l'héritage, vous avez quelques options:

  1. Faire un mappage pour la classe dérivée
  2. Ajouter un convertisseur pour votre classe pour copier d'un type dans l'autre (fonte ne suffit pas, il ne changera pas l'objet sous-jacent)
  3. utilisation ICloneable

Toutes ces méthodes sont assez lourdes. Si votre conception le permet, au lieu de l'héritage, utilisez des classes partielles ou des méthodes d'extension. Ce dernier est ce que je trouve dans mes propres projets, apparemment je me suis heurté à cela auparavant et j'ai pris l'habitude d'utiliser des méthodes d'extension.

+0

C'est la même chose que ce que j'ai .... J'ai moulé B à A mais je reçois toujours la même erreur: Pas de persister pour B – John

+0

J'ai réécrit la réponse, j'étais un peu trop rapide. – Abel

+1

Cette réponse a beaucoup aidé, même après 1,5 ans :) – SadullahCeran

Questions connexes