我得到的對象列表分別(而不是從NHibernate),並設置父對象的IEnumerable等於這個返回的對象。最初,我們只需要讀取對象。然後,我們需要僅更新父級上的特定字段。最近,我們需要更新孩子的領域。到目前爲止,SaveOrUpdate()都很好。現在,即使將子集合連接到分離的父對象(不使用NHibernate),我也需要更新子項。以下代碼會導致父級更新,但不會導致子級。如果我全部都做了,那麼如果父母沒有收藏,那麼這些孩子將被刪除。我不想這樣做,因爲我擔心這不會造成這種行爲的遺留使用。Cascade.All()是否可以刪除?
希望的行爲:
1.級聯對集合的任何更改(無論父級是否由NHibernate檢索)。 2.即使家長沒有孩子的集合,也不要刪除對象。
這可能嗎?
這是我們的NHibernate的保存方法:
[Transaction]
public int? Save(DocumentFieldDTO entity, bool autoFlush)
{
var persisted = CurrentSession.Merge(entity);
entity.DocumentFieldID = persisted.DocumentFieldID;
if (autoFlush) { CurrentSession.Flush(); }
return entity.DocumentFieldID;
}
的DocumentFieldDTOMap是這樣的:
public class DocumentFieldDTOMap : EntityMapBase
{
public DocumentFieldDTOMap()
{
Table("DocumentField");
Id(m => m.DocumentFieldID).GeneratedBy.Increment().UnsavedValue(null);
Map(x => x.Name);
Map(x => x.DocumentSectionID).Not.Update();
// .... Lots of other fields ....//
HasMany(x => x.DocumentFieldOrgs)
.Cascade.SaveUpdate()
.LazyLoad()
.KeyColumn("DocumentFieldID");
}
}
}
如果我改變Cascade.SaveUpdate()
到Cascade.All()
更新工作,也將刪除。我想消除刪除功能。
更新(2014年1月27日):
我只是驗證了刪除被級聯時映射爲SaveUpdate()
,所以這不是一個大問題,因爲我不改變現有的功能。我仍然希望能夠更新所有級聯的EXCEPT刪除。如果可能的話,一個解決方案對於未來的參考很有用。
更新(2014年2月10日)
以下是驗證測試,當級聯「SaveUpdate()」孩子們都將被刪除。 GetDocumentFieldDTOWithADO(DocumentFieldID)
使用與NHibernate相同的事務,並且在第一次調用時(保存前)有318個DocumentFieldOrgs,在保存後調用時爲0。也許這個測試有問題嗎?它是否因爲我打電話合併而刪除了孩子?
[Test]
public void Save_ShouldDeleteDocumentFieldOrgs_WhenSavingDocumentFieldWithoutDocFieldOrgsList()
{
//arrange
var expectedDocField = GetDocumentFieldDTOWithADO(DocumentFieldID);
expectedDocField.DocumentFieldOrgs = null;
//act
Repository.Save(expectedDocField, false);
SessionFactory.GetCurrentSession().FlushAndEvict(expectedDocField);
//assert
var actualDocField = GetDocumentFieldDTOWithADO(DocumentFieldID);
actualDocField.DocumentFieldOrgs.Should()
.BeEmpty("DocumentFieldOrgs should be deleted if the parent does not have a child collection");
}
更新(2/11/2014) - Radim在他的回答中是正確的。 NHibernate沒有刪除這些孩子。它將它們與父母分離。
我不明白你的迴應。如果父POCO對象沒有任何子POCO對象,NHibernate將從數據庫中刪除子記錄。我可以在保存實現中實現對孩子的變更管理,但我希望NHibernate能夠處理對象映射和變更管理。我想我希望有一些映射或SaveUpdate/Merge方法的實現可以指示NHibernate更新記錄,但絕不會刪除一個對象。您可以更好地控制您可以更新的內容,但不會被刪除。 –
也許我不明白你的問題。級聯的工作方式如下:1)必須有父級傳遞給會話(SaveOrUpdate(父級)2)任何子級將按照此處所述進行級聯http://nhforge.org/doc/nh/en/index.html#manipulatingdata-圖表。 3)在'save-udpate'的情況下,永遠不會發布刪除。 4)如果「全部」刪除將只發布到當前已經存在的和刪除的項目。但在任何情況下,**都必須在會話中提供父母和子女的收集才能執行這些步驟。這是奇怪的:'..是否在父母被NHibernate檢索或不'這是否有幫助? –
Radim,我會再次檢查,但在我的集成測試中,cascade.SaveUpdate()也發出刪除。 –