Fluent NHibernate在集合之间移动对象时发生异常

本文关键字:异常 对象 移动 NHibernate 集合 之间 Fluent | 更新日期: 2023-09-27 17:57:49

当将对象从一个集合移动到另一个集合时,并且当级联设置为"全部删除孤立"时,我会得到以下异常:

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

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

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

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

Fluent NHibernate在集合之间移动对象时发生异常

NHibernate对孤儿有着非常局部的看法。如果对象从文件夹A移动到文件夹B,文件夹A会将其视为孤立对象,因此会将其删除。文件夹B希望更新该对象,但会发生冲突。

这叫做重新养育子女,你在这里读到了http://fabiomaulo.blogspot.com/2009/09/nhibernate-tree-re-parenting.html

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