我得到的对象列表分别(而不是从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()也发出删除。 –