0

私はこのマッピングを1つのクラスに持っています:

<class name="Parent">
<set name="Activity" table="ChangeLogs" order-by="ChangeDate desc" cascade="all-delete-orphan">
  <key column="RequestID" />
  <one-to-many class="ChangeLog" />
</set>

そして、これは他のものです:

<class Name="Child">
<many-to-one name="Request" class="Request" column="RequestID" />

親では、コレクションに追加する現在のトランザクションにロードされます。

parent.Activity.Add(new Child(){/* properties, etc */});

そして、トランザクションをコミットします。親への変更は update 呼び出しでデータベースに保存されますが、カスケード値または inverse=true/false/just-save-already に関係なく、それらの子を挿入することはできません。私はしばらくの間、例/ドキュメント/などを読んで頭を悩ませてきましたが、なぜうまくいかないのかわかりません。簡単なものがありませんか?サーバーを強制終了し、変更のたびに再構築して、更新されていることを確認してきましたが、.

さらに悪いことに、逆のさまざまな値を使用して、時には Request=parent を子に追加することによって、時には追加する前に子を個別に保存することによって、うまくいくことあります...そして、後で作業を終了します。私は途方に暮れていますo_O

編集:これが投稿されてから明示的に試行されたもの、再構築+サーバーの再起動、いずれも挿入呼び出しまたはエラーを生成しません:

<set inverse=true>
parent.Activity.Add(new Child(){Request=parent})
<set inverse=true>
parent.Activity.Add(new Child(){})
<set>
parent.Activity.Add(new Child(){Request=parent})
<set>
parent.Activity.Add(new Child(){})
<set inverse=false>
parent.Activity.Add(new Child(){Request=parent})
<set inverse=false>
parent.Activity.Add(new Child(){})

これはうまくいきました:

<set>
Child c = new Child() {Request = parent};
parent.Activity.Add(c);
Session.Save(c);

しかし、無視された場合、カスケードを設定する意味は何ですか?

編集:これを少し読んだ後:http://nhibernate.info/doc/nh/en/index.html#example-parentchild-bidir私が試した:

<class Name="Child">
<many-to-one name="Request" class="Request" column="RequestID" not-null=true />

上記の6つの主要なものすべてで、運がありません。

4

2 に答える 2

1

私にとって、一度に適切に設定することは常に問題です。最初はあなたのコードはすべてうまくいっているように見えますが、逆のプロパティをどちら側に設定しているのか実際には疑問に思っていますか?

このコードは私のために働きます:

<class name="Parent" table="Parent">

<bag name="Languages" inverse="true" cascade="all-delete-orphan" lazy="false" fetch="join">
  <key column="parentId" />
  <one-to-many class="Language" />
</bag>

<class name="Language" table="Language">

<many-to-one column="parentId" name="Parent" class="Parent" not-null="true" />

これが役立つことを願っています。

于 2011-03-26T08:49:54.053 に答える
0

これは正しいマッピングです:

<class name="Parent">
  ...
  <set cascade="all-delete-orphan" inverse="true" ...>
  ...
  </set>
</class>
<class name="Child">
  ...
  <many-to-one .../>
</class>

正しい使用法 (既存の親を想定):

using (var tx = session.BeginTransaction())
{
    var parent = GetParent();
    parent.Collection.Add(new Child { Parent = parent });
    tx.Commit();
}
于 2011-03-26T13:45:47.460 に答える