まず、NHibernate 3.2 と FluentNHibernate 1.3 を使用しています。私は3つのクラスを持っています:
public class ClassA
{
public virtual Int32 Id{ get; }
....
public ICollection<ClassB> ClassesB { get; }
public ICollection<ClassC> ClassesC { get; }
}
public class ClassB
{
public virtual Int32 Id{ get; }
....
public ICollection<ClassA> ClassesA { get; }
public ICollection<ClassC> ClassesC { get; }
}
public class ClassC
{
public virtual Int32 Id{ get; }
....
public ICollection<ClassA> ClassesA { get; }
public ICollection<ClassB> ClassesB { get; }
}
私はこのコードでそれらをマッピングしました:
public class ClassAMap : ClassMap<ClassA>
{
public ClassAMap()
: base()
{
Id(m => m.Id);
....
HasManyToMany<ClassB>(m => m.ClassesB).Cascade.SaveUpdate().AsSet().ReadOnlyAccess();
HasManyToMany<ClassC>(m => m.ClassesC).Cascade.SaveUpdate().AsSet().ReadOnlyAccess();
}
}
public class ClassBMap : ClassMap<ClassB>
{
public ClassBMap()
: base()
{
Id(m => m.Id);
....
HasManyToMany<ClassA>(m => m.ClassesA).Cascade.SaveUpdate().AsSet().ReadOnlyAccess();
HasManyToMany<ClassC>(m => m.ClassesC).Cascade.SaveUpdate().AsSet().ReadOnlyAccess();
}
}
public class ClassCMap : ClassMap<ClassC>
{
public ClassCMap()
: base()
{
Id(m => m.Id);
....
HasManyToMany<ClassA>(m => m.ClassesA).Cascade.SaveUpdate().AsSet().ReadOnlyAccess();
HasManyToMany<ClassB>(m => m.ClassesB).Cascade.SaveUpdate().AsSet().ReadOnlyAccess();
}
}
各クラスには他の 2 つのクラスへのコレクションがあります。理由は聞かないでください。これをデータベースにマップする必要があります。Nhibernate は 3 つのテーブルを生成します。そのうちの 2 つには 2 つのフィールドがあり、3 つ目はすべてのクラスの 3 つの id フィールドがあります。この 3 つ目のテーブルは 2 つのフィールドのみが主キーの一部です。また、3 つのリレーションシップにテーブル名を割り当てようとしましたが、NHibernate は 3 つのフィールドを持つテーブルを 1 つしか生成しませんが、ここでもそのうちの 2 つだけが主キーの一部です。このタイプのマッピングでは、3 フィールドが主キーの一部である必要があると想定しています。
問題は、保存しようとしたときに、どちらのコレクションにもアイテムを追加できないことです (たとえば、ClassB を ClassA に追加すると、ClassA を ClassB に追加して関係を維持することもできます)。データベースに、それは FOREING KEY 例外をスローし、すべてのフィールドが正しく設定されます。
私の質問は、これら 3 つのクラスをマッピングする最良の方法は何ですか? 他に何かする必要がありますか?私は何かを忘れていますか?