流畅的NHibernateexception在集合之间移动对象

将一个对象从一个集合移动到另一个集合时,当cascade设置为all-delete-orphan时,我得到以下exception:

已删除的对象将通过级联重新保存(从关联中删除已删除的对象)

我认为当你使用all-delete-orphan时,nhibernate不会在另一个集合中引用它时删除它。

任何人都可以确认,当你有像文件夹这样的对象包含文件夹或文件并将文件从一个文件夹移动到另一个文件夹时,你不应该得到这个例外吗?

我在vs2010中制作了一个示例项目来演示这种行为。 任何人都可以说我的映射是正确的还是nhibernate中有错误?

FileMapping.cs

public class FileMapping: ClassMap { public FileMapping() { Id(x => x.Id, "Id").GeneratedBy.Native("File_seq"); Map(x => x.Name, "Name").Not.Nullable(); References(x => x.Folder).Not.Nullable().Column("idFolder"); } } 

FolderMapping.cs

 public class FolderMapping: ClassMap { public FolderMapping() { Id(x => x.Id, "Id").GeneratedBy.Native("Folder_seq"); Map(x => x.Name, "Name").Not.Nullable(); HasMany(x => x.Folders).Inverse().Cascade.AllDeleteOrphan().KeyColumn("idParentFolder"); HasMany(x => x.Files).Inverse().Cascade.AllDeleteOrphan().KeyColumn("idFolder"); References(x => x.ParentFolder).Nullable().Column("idParentFolder"); } } 

示例项目: http : //www.mediafire.com/? orxcw63aziq54xo说明:

  1. 确保Project的属性中的连接字符串是正确的
  2. 运行项目
  3. 单击第一个按钮:连接到数据库
  4. 单击右上角按钮创建表和示例数据(2个文件夹对象和1个文件)
  5. 单击按钮将文件对象移动到其他文件夹对象
  6. 单击按钮以保持机会:您将获得DeletedObjectException

NHibernate对孤儿有一个非常本地化的观点。 如果将对象从文件夹A移动到文件夹B,则文件夹A将其视为孤立,因此将其删除。 文件夹B想要更新对象并发生冲突。

它被称为重新育儿,你在这里阅读它http://fabiomaulo.blogspot.com/2009/09/nhibernate-tree-re-parenting.html

基本上,这是一个重新定义Orphan在您的集合中的含义的选项,因此您的对象不会被删除。