问题描述
|
当将一个对象从一个集合移动到另一个集合,并且级联设置为all-delete-orphan时,出现以下异常:
删除的对象将通过级联重新保存(从关联中删除删除的对象)
我认为当您使用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
说明:
确保Project \ Properties中的连接字符串正确
运行项目
单击第一个按钮:连接到数据库
单击右上角的按钮创建表和示例数据(2个文件夹对象和1个文件)
单击按钮将文件对象移动到其他文件夹对象
单击按钮以保持机会:您将获得DeletedobjectException
解决方法
NHibernate对孤儿有非常局部的看法。如果将对象从文件夹A移到文件夹B,则文件夹A会将其视为孤立对象,因此将其删除。文件夹B要更新对象,并且发生冲突。
这称为重新父母化,您可以在此处阅读有关它的信息http://fabiomaulo.blogspot.com/2009/09/nhibernate-tree-re-parenting.html
基本上,这是一个重新定义Orphan在集合中含义的选项,这样就不会删除对象。