Кластеризируемый в основном означает, что данные находятся в том физическом порядке в таблице. Поэтому у Вас может быть только один на таблицу.
Некластеризованный означает, что это - "только" логический порядок.
Пол Батум ответил на мой вопрос здесь и предоставил автономный рабочий пример здесь (нажмите кнопку «Загрузить» после перехода на связанную страницу).
Следующий код скопирован из его ответа. Ключевым моментом является класс StoreMap в конце листинга, который устанавливает переопределение с помощью предложения Where, которое использует свойство IsManager в Employee.
Обратите внимание, что (по крайней мере, с v. 1.0.0.594) есть один большая проблема с Automapping - класс сопоставления (например, StoreMap) не может находиться в том же пространстве имен, что и класс домена (например, Store)!
В противном случае NHibernate выдаст "NHibernate.MappingException: (XmlDocument) (2,4): ошибка проверки XML: ... ", с абсолютно никаких указаний на то, в чем или где настоящая проблема.
Вероятно, это ошибка, которая может быть исправлена в более поздних версиях Fluent NHibernate.
public class Employee
{
public virtual int Id { get; private set; }
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
public virtual bool IsManager { get; set; }
}
public class Store
{
public virtual int Id { get; private set; }
public virtual IList<Employee> Staff { get; private set; }
public virtual IList<Employee> Managers { get; private set; }
public Store()
{
Staff = new List<Employee>();
Managers = new List<Employee>();
}
public void AddManager(Employee employee)
{
employee.IsManager = true;
this.Managers.Add(employee);
}
public void AddStaff(Employee employee)
{
this.Staff.Add(employee);
}
}
Вот переопределение сопоставления для магазина:
// Must be in different Namespace from class Store!!!
public class StoreMap : IAutoMappingOverride<Store>
{
public void Override(AutoMapping<Store> mapping)
{
mapping.HasMany(x => x.Managers)
.Cascade.All()
.Where("(IsManager = 1)");
mapping.HasMany(x => x.Staff)
.Cascade.All()
.Where("(IsManager = 0)");
}
}