2009-10-15 7 views
0

Je sais que dans NHibernate vous pouvez avoir des mappages d'héritage, et je sais que vous pouvez avoir une table par classe, une table par sous-classe et une table par classe concrète, mais elles ne correspondent pas vraiment au scénario J'ai.NHibernate Inheritance Mapping

Fondamentalement, ce que je veux est d'être en mesure d'avoir une classe de base appelée produit qui ressemble à ceci:

public class BaseProduct 
{ 
    public virtual int ProductId {get;set;} 
    public virtual string ProductName {get;set;} 
} 

qui correspond directement à une table de produits.

Alors je veux avoir une classe de produit qui hérite de BaseProduct comme ceci:

public class Product : BaseProduct 
{ 
    public virtual IList<Category> Categories {get;set;} 
} 

La chose est que la classe Product devrait toujours mapper à la table des produits, la seule différence étant que cette mise en œuvre a liste des catégories attachées. Sans entrer dans les raisons techniques pour lesquelles j'ai besoin de faire cela, je voudrais savoir si c'est possible?

+0

Quand utiliseriez-vous une classe par rapport à l'autre? –

+0

Le problème de base est donc de sérialiser les proxies NHibernate via WCF. Si j'ai une requête où je veux renvoyer un produit de base seulement, alors je chargerais normalement la collection de Catégories, mais malheureusement, cela ne fonctionne pas si bien dans WCF parce qu'il essayera toujours et chargera paresseux les catégories sur serializtion. – lomaxx

Répondre

3

De votre question et commentaire, je reçois que vous voulez «Single Table Inheritance» [PoEAA, Fowler], mais ne pas le luxe de pouvoir ajouter le discriminateur nécessaire à la table. Je n'ai jamais rencontré cette situation moi-même, mais essayez d'ajouter un discriminateur à votre mapping qui est une valeur calculée/un champ dérivé qui utilise sql pour savoir s'il y a des clés étrangères de Category (ne fonctionnera pas pour Produits avec des collections de catégorie vides cependant).

Si votre scénario est en lecture seule et que vous pouvez ajouter des vues à la base de données, il est possible de mapper vers une vue de produit avec le discriminateur calculé comme indiqué ci-dessus.

+0

Techniquement parlant, un discriminateur fonctionnera ... donc je vais accepter ça pour l'instant. – lomaxx

0

Vous cherchez une table perclass vous devez définir un discriminateur valeur NHDoc for inheritance

+0

La table par classe est proche de ce que je veux, mais je n'ai pas de discriminateur. Essentiellement ce que je veux, c'est une table par classe sans discriminateur – lomaxx

0

Avez-vous d'autres classes héritées de BaseProduct? Si ce n'est pas le cas, vous pouvez uniquement mapper la classe de produit.