views:

269

answers:

3

I know in NHibernate you can have inheritance mappings, and I know you can have table-per-class, table-per-subclass and table-per-concrete-class but they don't quite fit the scenario I have.

Basically what I want is to be able to have a base class called product that looks like this:

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

which maps directly to a product table.

Then I want to have a Product class which inherits from BaseProduct like this:

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

The thing is that the Product class should still map to the product table, the only difference being that this implementation has a list of Categories attached.

Without going into the technical reasons for why I need to do this, I would like to know if it's at all possible?

A: 

You are looking for a table perclass you need to set a discriminator-value NHDoc for inheritance

Aaron Fischer
Table per class is close to what I want, but I don't have a discriminator. Essentially what I want is table-per-class without a discriminator
lomaxx
+3  A: 

From your question and comment, I get that you want «Single Table Inheritance» [PoEAA, Fowler], but don't have the luxury of being able to add the needed discriminator to the table.

I've never run into this situation myself, but try to add a discriminator to your mapping which is a calculated value/derived field that uses sql to find out if there are foreign keys from Category (won't work for Products with empty Category collections though).

If your scenario is a read-only one, and you can add views to the DB, it's an option to map to a Product view with the discriminator calculated as stated above.

Martin R-L
Technically speaking a discriminator will work.. so I'm going to accept this for now.
lomaxx
A: 

Do you have other classes that inherit from BaseProduct? If not, you can just map the Product class only.

Jamie Ide