22

Fluent NHibernate を使用していますが、クラスの 1 つと多対多の関係をセットアップする際に問題が発生しています。それはおそらくばかげた間違いですが、私はそれを機能させようとして少し立ち往生しています。とにかく、多対多の関係を持ついくつかのクラスがあります。

public class Person
{
    public Person()
    {
        GroupsOwned = new List<Groups>();
    }

    public virtual IList<Groups> GroupsOwned { get; set; }
}

public class Groups
{
    public Groups()
    {
        Admins= new List<Person>();
    }

    public virtual IList<Person> Admins{ get; set; }
}

このようなマッピングで

人: ...

HasManyToMany<Groups>(x => x.GroupsOwned)
    .WithTableName("GroupAdministrators")
    .WithParentKeyColumn("PersonID")
    .WithChildKeyColumn("GroupID")
    .Cascade.SaveUpdate();

グループ: ...

 HasManyToMany<Person>(x => x.Admins)
    .WithTableName("GroupAdministrators")
    .WithParentKeyColumn("GroupID")
    .WithChildKeyColumn("PersonID")
    .Cascade.SaveUpdate();

統合テストを実行するとき、基本的には新しい個人とグループを作成しています。グループを Person.GroupsOwned に追加します。リポジトリから Person オブジェクトを取得すると、GroupsOwned は最初のグループと同じですが、Group.Admins のカウントを確認するとグループを取得すると、カウントは 0 になります。Join テーブルには GroupID があり、そこにPersonIDが保存されています。

アドバイスありがとうございます。

4

4 に答える 4

39

テーブルに2つのレコードを追加しているという事実は、逆属性が欠落しているように見えます。個人とグループの両方が変更されているため、NHibernateは関係を2回(オブジェクトごとに1回)保持しています。逆属性は、特にこれを回避するためのものです。

コードのマッピングに追加する方法はわかりませんが、リンクにはXMLで追加する方法が示されています。

于 2008-09-20T17:57:59.857 に答える
7

@サンティアゴあなたが正しいと思います。

答えは、ManyToMany宣言の1つを削除する必要があるということかもしれません。Fluentを詳しく見ると、それを実行するのに十分賢いように見えます。

于 2008-09-20T18:08:55.570 に答える
0

Person を Groups.Admin に追加していることを確認していますか? 両方のリンクを作成する必要があります。

于 2008-09-20T16:44:01.173 に答える
0

テーブルが三つありますよね?

人、グループ、および GroupAdministrators

両側に追加すると、

人 (ID が p1) グループ (ID が g1)

GroupAdministrators には、2 つの列と 1 つのテーブルがあります。

(p1,g1)

(p1,g1)

単体テスト コードは次のようになります。

Context hibContext //Built here
Transaction hibTrans //build and start the transaction.

Person p1 = new Person()
Groups g1 = new Groups()

p1.getGroupsOwned().add(g1)
g1.getAdmins().add(p1)

hibTrans.commit();
hibContext.close();

次に、テストで新しいコンテキストを作成し、テストしてコンテキストの内容を確認すると、正しいものが返されますが、テーブルはすべてめちゃくちゃですか?

于 2008-09-20T17:48:43.233 に答える