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说明:
- 确保"项目属性"中的连接字符串正确
- 运行项目
- 单击第一个按钮:连接到数据库
- 单击右上角按钮可以创建表和示例数据(2个文件夹对象和1个文件)
- 单击按钮可将文件对象移动到其他文件夹对象
- 单击按钮以保持机会:您将获得DeletedObjectException
NHibernate对孤儿有着非常局部的看法。如果对象从文件夹A移动到文件夹B,文件夹A会将其视为孤立对象,因此会将其删除。文件夹B希望更新该对象,但会发生冲突。
这叫做重新养育子女,你在这里读到了http://fabiomaulo.blogspot.com/2009/09/nhibernate-tree-re-parenting.html
基本上,这是一个重新定义Orphan在集合中的含义的选项,这样您的对象就不会被删除。