There is one way to use many-to-many by using Ayende Generics that overrides the default accessor.
Code:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0" namespace="DAL" assembly="DAL" default-cascade="save-update">
<class name="CAdmin" table="Admin" >
<id name="Id" type="Int32" column="id" unsaved-value="0">
<generator class="native" />
</id>
<map name="Pages" inverse="false" lazy="false" cascade="save-update" table="Admin2Pages" access="NHibernate.Generics.GenericAccessor, NHibernate.Generics">
<key column="IdAdmin" />
<index-many-to-many column="IdPage" class="CPage" />
<element column="AccessType" type="Int32" not-null="true" />
</map>
</class>
</hibernate-mapping>
Notice the Key element AccessType that is part of the relation table.
This XML will appear in classes as:
Code:
namespace DAL
{
public class CAdmin: MarshalByRefObject
{
private int id;
private EntityDictionary<CPage, int> _pages;
public CAdmin()
{
_pages = new EntityDictionary<CPage, int>(
delegate( KeyValuePair<CPage, int> obj )
{
obj.Key.Admins.Add( this, obj.Value );
},
delegate( KeyValuePair<CPage, int> obj )
{
obj.Key.Admins.Remove( this );
},
InitializeOnLazy.Always );
}
public virtual int Id
{
get
{
return id;
}
set
{
id = value;
}
}
public virtual IDictionary<CPage, int> Pages
{
get
{
return _pages;
}
}
}
}