Search code examples
c#databasenhibernateormfluent-nhibernate

Fluent nHibernate - How to map a non-key column on a junction table?


Taking an example that is provided on the Fluent nHibernate website, I need to extend it slightly:

alt text
(source: fluentnhibernate.org)

I need to add a 'Quantity' column to the StoreProduct table. How would I map this using nHibernate?

An example mapping is provided for the given scenario above, but I'm not sure how I would get the Quantity column to map to a property on the Product class:

public class StoreMap : ClassMap<Store>
{
  public StoreMap()
  {
    Id(x => x.Id);
    Map(x => x.Name);
    HasMany(x => x.Employee)
      .Inverse()
      .Cascade.All();
    HasManyToMany(x => x.Products)
     .Cascade.All()
     .Table("StoreProduct");
  }
}

Solution

  • One suggestion would be to not use the hasManyToMany mapping and have a separate mapping class for StoreProduct which is a subclass of Product.

    New Store Mapping

    public class StoreMap : ClassMap<Store>
    {
      public StoreMap()
      {
        Id(x => x.Id);
        Map(x => x.Name);
        HasMany(x => x.Employee)
          .Inverse()
          .Cascade.All();
        HasMany(x => x.Products)
         .Cascade.All();
      }
    }
    

    NB changed HasManyToMany to HasMany instead.

    New sub class mapping for Store Product

    public class StoreProductMap : SubclassMap<StoreProduct>
    {
       References(x=>x.Store);
    
       Map(x=>x.Quantity);
    }
    

    New StoreProduct entity

    public class StoreProduct : Product
    {
        public virtual Store Store {get;set;}
        public virtual int Quantity {get;set;}
    }
    

    Hope that helps.