【问题标题】:Fluent NHibernate exception moving objects between collectionsFluent NHibernate 异常在集合之间移动对象
【发布时间】:2011-08-11 06:00:07
【问题描述】:

当将对象从一个集合移动到另一个集合并且级联设置为 all-delete-orphan 时,出现以下异常:

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

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

任何人都可以确认,当您有像文件夹这样包含文件夹或文件的对象并且您将文件从一个文件夹移动到另一个文件夹时,您不应该遇到此异常?

我在 vs2010 中做了一个示例项目来演示这种行为。谁能说我的映射是否正确或 nhibernate 中是否存在错误?

文件映射.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");
    }
}

文件夹映射.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

【问题讨论】:

  • 无论您是在移动文件夹还是文件,是否都会出现异常,还是仅在尝试将文件夹移动到其他文件夹时发生?
  • @jay:当我将文件移动到另一个文件夹时出现错误,但还记得在将文件夹移动到另一个文件夹时看到此异常。但是,在我的应用程序中,不再支持这种情况,因此该错误不再显示。 @vadim:用链接和说明更新帖子

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


【解决方案1】:

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

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

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

【讨论】:

  • 感谢重新育儿链接,尽管我设法以更简单的方式解决了它。我所做的很简单:添加了一个具有许多文件的映射的驱动器类,并将 Cascade.AllDeleteOrphan 放在上面而不是文件夹映射上。所以只有当我从驱动器中删除文件时,它才会被 HNibernate 删除。更改父/文件夹时不再有问题:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-11
  • 2011-02-06
  • 2013-11-22
相关资源
最近更新 更多