0

User、Department、UserDepartment の 3 つのテーブルがあります。ユーザーは複数の部門に関連付けることができ、部門は複数のユーザーに関連付けることができます。次のように、両側で多対多の流暢なマッピングを使用します。

部門用

HasManyToMany(x => x.Users)
    .Table("UserDepartment")
    .ParentKeyColumn("DepartmentId")
    .ChildKeyColumn("UserId")
    .AsSet()
    .Cascade.All();

ユーザー向け

HasManyToMany(x => x.Departments)
    .Table("UserDepartment")
    .ParentKeyColumn("UserId")
    .ChildKeyColumn("DepartmentId")
    .AsBag()
    .Inverse()
    .Cascade.None();

すべてのテーブルは、次のように、HiLo Id ジェネレーターとほぼ同様のマッピングを使用します。

Id(p => p.Id).GeneratedBy.HiLo("HiLo", "NextHi", "32", "ForTable = 'UserDepartment'");

一部のユーザーを部門 nhiberante に追加しようとすると、次のエラーで失敗します。

バッチ コマンドを実行できませんでした。[SQL: SQL が利用できません]。内部例外: 値 NULL を列 'Id'、テーブル 'test.dbo.UserDepartment' に挿入できません。列はヌルを許可しません。INSERT が失敗しました。\r\nステートメントは終了しました。

私は同じ HiLo ジェネレーターを他のテーブルで使用しているので、この失敗の原因にはならないと確信しています。

誰かがこの問題に光を当てることができますか? 過去にnull Id挿入に問題があったことを思い出すことができ、コレクションで逆マッピングを使用して解決しましたが、両側で逆マッピングを使用できないため、別の解決策が必要です。

4

1 に答える 1

1

最後に、解決策を見つけました。次の 2 つの方法があります。

  1. テーブルから合成 ID を削除し、代わりに複合 ID を使用してください。
  2. XML マッピングを使用して、idbag の動作を指定します。

説明: NHibernate、HiLo、および多対多の関連付け

于 2014-08-05T11:09:26.873 に答える