流畅的NHibernate异常在集合之间移动对象

时间:2011-05-26 15:27:12

标签: c# nhibernate exception fluent-nhibernate nhibernate-mapping

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

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

我认为nhibernate在使用all-delete-orphan时在另一个集合中引用时不会删除该对象。

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

我在vs2010中制作了一个示例项目来演示此行为。任何人都可以说我的映射是否正确或者是否存在nhibernate中的错误?

FileMapping.cs

public class FileMapping: ClassMap<File>
{
    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<Folder>
{
    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的属性中的connectionstring正确
  2. 运行项目
  3. 点击第一个按钮:连接数据库
  4. 点击右上角按钮创建表格和样本数据(2个文件夹对象和1个文件)
  5. 单击按钮将文件对象移动到其他文件夹对象
  6. 单击按钮以保持机会:您将获得DeletedObjectException

1 个答案:

答案 0 :(得分:2)

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

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

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