3

之间移动对象时从一个集合移动对象到另一个时级联设置为全删除,孤儿,我得到以下异常:功能NHibernate例外集合

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

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

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

我在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. 使项目的属性肯定的ConnectionString正确
  2. 运行项目
  3. 点击第一个按钮:连接到数据库
  4. 点击右上角的按钮来创建表和样本数据(2文件夹对象和1个文件)
  5. 点击按钮将文件对象移动到其他文件夹中对象
  6. 点击按钮以保持机会:你将得到DeletedObjectException
+0

无论您是移动文件夹还是文件,您是否都会遇到异常,或者仅在尝试将文件夹移动到其他文件夹时才会发生异常? – Jay 2011-05-26 16:05:56

+0

发布您的测试用例。 – Vadim 2011-05-26 17:39:10

+0

@jay:当我将文件移动到另一个文件夹时出现错误,但还记得在将文件夹移动到另一个文件夹时看到此异常。但是,在我的应用程序中,此方案不再受支持,因此该错误不再显示。 @vadim:更新后的链接和说明 – Martin 2011-05-26 19:44:39

回答

2

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

这就是所谓的再养育你读到这里http://fabiomaulo.blogspot.com/2009/09/nhibernate-tree-re-parenting.html

基本上这是重新定义什么意思孤儿您的收藏让你的对象不会被删除的选项。

+0

感谢您的重新注册链接,尽管我设法以更简单的方式解决它。我所做的很简单:添加一个带有许多文件的映射的Drive-class,并将Cascade.AllDeleteOrphan放在该文件夹上,而不是在Folder-mapping上。所以只有当我从驱动器中删除文件时,它才会被HNibernate删除。更改父/文件夹时没有更多问题:) – Martin 2011-08-23 09:18:44