NHibernateの逆属性


89

逆属性を使用するにはどうすればよいですか?私が間違っていない場合、1対多の関係では、inverse属性をtrueに設定する必要があります。多対多の関係では、エンティティクラスの反転属性の1つをtrueに設定し、もう1つをfalseに設定する必要があります。

誰でもこれにいくつかの光を当てることができますか?


2
同様の質問で、私の回答「inverse = "true | false"を使用する場合」を確認することもできます。
Daniel Schilling

回答:


125

反転属性をtrueに設定しないでください...

関連付けの「所有者」を指定するには、inverse属性を使用します。(関連付けには所有者を1人しか含めることができないため、一方の端を逆に設定し、もう一方の端を「非逆」に設定する必要があります)。(所有者:inverse=false;非所有者:inverse=true

1対多の関連付けで、コレクションを逆の終わりとしてマークしない場合、NHibernateは追加のUPDATEを実行します。実際、この場合、NHibernateは最初にコレクションに含まれるエンティティを挿入し、必要に応じてコレクションを所有するエンティティを挿入し、その後、「コレクションエンティティ」を更新して、外部キーが設定され、関連付けが行われるようにします作られます。(これは、DBの外部キーがnull可能であることも意味することに注意してください)。

コレクションの終わりを「逆」としてマークすると、NHibernateは最初にコレクションを「所有」するエンティティを永続化し、その後コレクション内にあるエンティティを永続化して、追加のUPDATEステートメントを回避します。

したがって、双方向の関連付けでは、常に1つの逆の端点があります。


4
これは、所有者を追加するためのすべてがテーブルに外部キーを持つものであることを説明しています
Brijesh Mishra

48
私の意見では、これは本当に悪い用語です。「逆」ではなく、所有権をマークしてみませんか?!
UpTheCreek

1
既に否定されている用語で否定を使用する場合の+1 :) "INVERSE属性をtrueに設定してはなりません"
contactmatt

良い答えは、残りの唯一の問題は、誰が「所有者」であるべきかを決定する方法である
PandaWood

2つのエンティティ間の関係を保持する中間テーブルがある場合、多対多はどうでしょうか。
Dark_Knight

10

上記の回答に加えて私の理解によれば、コレクションに外部キー値を手動で永続化する必要があります。つまり、追加の更新ステートメントが必要ない場合です。

Parent par = Session.Get<Parent>(8);

Child ch = new Child();
ch.Name = "Emad";

//set the parent foreign key manually
ch.MyParent = par;

par.MyChildren.Add(ch);
Session.Save(par);

インバース属性の詳細については、次の投稿を確認してください:

http://www.emadashi.com/index.php/2008/08/nhibernate-inverse-attribute/


2

「所有者」がどこに来るのかはわかりますが、関連付けはパイプであり、どちらの端も見下ろすことができるため、どのエンティティがパイプを「所有」しているのかを説明することができます。

これを別の見方で見ると、1対多の関係では、実際には2つの関係が続いています。

関係1:親から多くの子供まで。

関係2:親から子へ

したがって、NHはSQLを実行してこれらのそれぞれをDBに格納しようとします。ただし、外部キーを設定すると、たとえば関係2で子が保存されている場合、関係1は関係2の「逆」であるため、親と子の関係も自動的に固定されます。 。

つまり、インバースとは、メインの関係を設定すると、デフォルトで得られるものです。つまり、NHがSQLを実行して関係1を修正する必要はなく、子コレクションをマークすることにより、逆NHは子コレクションが追加されたときにSQLの実行をスキップします。

私はあなたがNHに逆であると言わなかったなら、逆の関係も同様に配置して配置するためにSQLを実行するのに労力を浪費することになると思います-必要はありませんでした。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.