0

まず、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 つのクラスをマッピングする最良の方法は何ですか? 他に何かする必要がありますか?私は何かを忘れていますか?

4

1 に答える 1

1

NHに関係についてもう少し詳しく説明する必要があると思います。
AのマッピングとBのマッピングで完全な定義を書いてみてください。

HasManyToMany(a => a.ClassesB)
     .AsSet()
     .WithTableName("TBL_A_TO_B")
     .WithParentKeyColumn("A_ID")
     .WithChildKeyColumn("B_ID")
     .Cascade.All();
于 2012-07-17T10:15:40.453 に答える