2010-01-15 3 views
0

J'ai une classe Order et une classe SubOrder: Order descendant. Maintenant, Order a .Item et SubOrder (évidemment) l'ont aussi, mais SubOrder a besoin de SubItem pour être là. Ce qui est facile lors de sa création:Création d'une entité personnalisée (construction) dans NHibernate

Item = new SubItem((ISomeInterface)this); 

mais comment puis-je dire NHibernate pour créer au lieu de sous-élément de l'article quand il charge la base de données Sous-ordre (Session.get < > Sous-ordre (id))? Le type de l'objet n'est pas dans la base de données (et je n'en ai pas besoin et je ne veux pas qu'il soit là); c'est toujours "Item for Order, SubItem for SubOrder". De plus, il doit être créé avec (ISomeInterface) SubOrder comme paramètre constructeur. En bref, comment gérer la création d'entité personnalisée dans NHibernate pour réaliser les choses décrites ci-dessus? Est-il possible d'avoir une référence à SubOrder lors de la création de SubItem (je peux vivre avec la propriété "injection" sinon)?

Je peux probablement utiliser IUserType mais cela semble être une surcharge; et je ne vois pas comment appliquer IUserType à SubOrder.Item seulement (même chose pour IInterceptor). Aussi, je ne vois pas comment obtenir une référence à l'ordre parent, sauf pour utiliser l'événement OnLoad pour le SubOrder et définir les propriétés SubItem là ... ce qui est gênant.

+0

Je ne comprends pas. SubItem n'est-il pas mappé en tant que sous-classe de Item dans vos mappages NHibernate? – hackerhasid

+0

Oui, il n'est pas mappé. Comme je l'ai dit, je ne veux pas le mapper, car cela signifie un champ supplémentaire dans la base de données - alors que ce sont des informations purement statiques déjà disponibles pour le programme (Order-> Item, SubOrder-> SubItem). Je peux vivre avec la cartographie si je peux - mais je voudrais le faire sans champs supplémentaires pour surmonter certaines limitations du logiciel. – queen3

Répondre

0

"OnLoad événement pour le SubOrder et définir les propriétés SubItem là" -> il y a une solution.

Sinon, vous pouvez essayer d'écrire un custom ReflectionOptimizer.

Questions connexes