複合IDを構成する2つのID以外のフィールドが含まれている場合、リンクテーブルを自動マッピングでマップすることはできません。あなたの場合、Partyテーブルには、適切に設計されていないために自動マッピングルールに違反するIdフィールドがあります(つまり、複合IDには自動インクリメントIDを含めるべきではありませんが、これは私が作業する場所のインデックス作成のために行います)。
これを修正するには、PartyのClassMapを作成し、IdをIDとしてマップし、PersonとOrganizationを参照する必要があります。
次に、PersonエンティティとOrganizationエンティティで、PartyへのHasManyToManyマッピングを作成する代わりに、PartyエンティティへのHasManyを作成します。
実際、あなたがしていることは、コードを明示的に一致させてERDのように見せることですが、自動マッピングは、複合主キーのみが含まれている場合にのみ、リンクテーブルを介した多対多の関係を意味します。
これは私を3日間困惑させ、私はこのルートを「ハック」としてとらえましたが、数週間前にFluentNHibernateのグーグルグループでこの説明を後で読んだだけでした。
それがお役に立てば幸いです。そうでない場合は、コードをまとめてください。
同じ状況についての私の投稿も参照してください。
編集:
これがかなり高いレベルでどのように見えるかを示します。エンティティコンストラクターでコレクションを初期化し、セッターメソッドを作成する必要があることを忘れないでください。はじめにを参照してください
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);
}
}