逆属性を使用するにはどうすればよいですか?私が間違っていない場合、1対多の関係では、inverse属性をtrueに設定する必要があります。多対多の関係では、エンティティクラスの反転属性の1つをtrueに設定し、もう1つをfalseに設定する必要があります。
誰でもこれにいくつかの光を当てることができますか?
回答:
反転属性をtrueに設定しないでください...
関連付けの「所有者」を指定するには、inverse属性を使用します。(関連付けには所有者を1人しか含めることができないため、一方の端を逆に設定し、もう一方の端を「非逆」に設定する必要があります)。(所有者:inverse=false
;非所有者:inverse=true
)
1対多の関連付けで、コレクションを逆の終わりとしてマークしない場合、NHibernateは追加のUPDATEを実行します。実際、この場合、NHibernateは最初にコレクションに含まれるエンティティを挿入し、必要に応じてコレクションを所有するエンティティを挿入し、その後、「コレクションエンティティ」を更新して、外部キーが設定され、関連付けが行われるようにします作られます。(これは、DBの外部キーがnull可能であることも意味することに注意してください)。
コレクションの終わりを「逆」としてマークすると、NHibernateは最初にコレクションを「所有」するエンティティを永続化し、その後コレクション内にあるエンティティを永続化して、追加のUPDATEステートメントを回避します。
したがって、双方向の関連付けでは、常に1つの逆の端点があります。
上記の回答に加えて、私の理解によれば、コレクションに外部キー値を手動で永続化する必要があります。つまり、追加の更新ステートメントが必要ない場合です。
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/
「所有者」がどこに来るのかはわかりますが、関連付けはパイプであり、どちらの端も見下ろすことができるため、どのエンティティがパイプを「所有」しているのかを説明することができます。
これを別の見方で見ると、1対多の関係では、実際には2つの関係が続いています。
関係1:親から多くの子供まで。
関係2:親から子へ
したがって、NHはSQLを実行してこれらのそれぞれをDBに格納しようとします。ただし、外部キーを設定すると、たとえば関係2で子が保存されている場合、関係1は関係2の「逆」であるため、親と子の関係も自動的に固定されます。 。
つまり、インバースとは、メインの関係を設定すると、デフォルトで得られるものです。つまり、NHがSQLを実行して関係1を修正する必要はなく、子コレクションをマークすることにより、逆NHは子コレクションが追加されたときにSQLの実行をスキップします。
私はあなたがNHに逆であると言わなかったなら、逆の関係も同様に配置して配置するためにSQLを実行するのに労力を浪費することになると思います-必要はありませんでした。