Вы не можете сопоставить таблицу связывания с автоматическим сопоставлением, если она содержит какие-либо поля, кроме двух идентификаторов, которые составляют составной идентификатор. В вашем случае в вашей таблице Party есть поле Id, которое нарушает правила автоматического сопоставления, поскольку оно не разработано должным образом (т. Е. Составной идентификатор не должен иметь идентификатора с автоинкрементным увеличением, хотя мы делаем это для индексации там, где я работаю).
Чтобы это исправить, вам просто нужно создать ClassMap для партии и отобразить Id в качестве Id и ссылочного персонажа и организации.
Затем в сущностях "Персона" и "Организация" вместо создания сопоставления HasManyToMany для партии вы создадите сущность HasMany для стороны.
На самом деле, то, что вы делаете, это явно сопоставляет код, чтобы он выглядел более похожим на ERD, в то время как автоматическое отображение подразумевает отношения «многие ко многим» через таблицу ссылок, только если она содержит только составной первичный ключ.
Это поставило меня в тупик на три дня, и я выбрал этот маршрут как "хак", но позже прочитал это объяснение в группе Google Fluent NHibernate пару недель назад.
Надеюсь, это поможет, если не смогу собрать для вас код.
См. Также мой пост о такой же ситуации .
редактирование:
Вот как это будет выглядеть на довольно высоком уровне. Помните, что вам придется инициализировать свои коллекции в конструкторах сущностей и создавать методы установки. См. Начало работы
public class Party {
public virtual int Id { get; set; }
public virtual Person Person { get; set; }
public virtual Organization Organization { get; set; }
}
public class PartyMap : ClassMap<Party> {
public PartyMap() {
Id(x => x.Id);
References(x => x.Person);
References(x => x.Organization);
}
}
public class Person {
public virtual int Id { get; set; }
public virtual string FName { get; set; }
public virtual string LName { get; set; }
public virtual ICollection<Party> Parties { get; set; }
}
public class PersonMap : ClassMap<Person> {
public PersonMap() {
Id(x => x.Id);
Map(x => x.FName);
Map(x => x.LName);
HasMany(x => x.Parties);
}
}
public class Organization {
public virtual int Id { get; set; }
public virtual string OrgName { get; set; }
public virtual string OrgDescription { get; set; }
public virtual ICollection<Party> Parties { get; set; }
}
public class OrganizationMap : ClassMap<Organization> {
public OrganizationMap() {
Id(x => x.Id);
Map(x => x.OrgName);
Map(x => x.OrgDescription);
HasMany(x => x.Parties);
}
}