簡體   English   中英

NHibernate級聯問題

[英]NHibernate cascading problems

我在一類中有此映射:

<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 */});

然后我提交交易。 對父級所做的任何更改都將通過更新調用保存到數據庫中,但是無論級聯值還是inverse = true / false / just-aaveyy,我都無法插入這些子級。 我一直在反對它一段時間,閱讀示例/文檔/等等,但我看不出為什么它不起作用。 我是否缺少簡單的東西? 為了確保一切都在更新,我一直在殺死服務器並重新構建,以確保一切正常。

更糟糕的是,偶爾它已經加入...然后就退出工作以后才另行制定,與逆各種值,有時由搶救孩子的加入請求=父到子,有時。 我在吵架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個主要項目都沒有運氣。

對我來說,一次性正確設置始終是一個問題。 最初,您的代碼中的所有內容看起來都不錯,但實際上我想知道您是在哪一側設置inverse屬性?

該代碼對我有用:

<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" />

我希望這有幫助。

這是正確的映射:

<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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM