Свободное исключение NHibernate для перемещающихся объектов между коллекциями

При перемещении объекта из одной коллекции в другую и когда для каскада установлено значение all-delete-orphan, я получаю следующее исключение:

удаленный объект будет повторно сохранен каскадом (удалить удаленный объект из ассоциаций)

Я думал, что nhibernate не удалит объект, если он ссылается в другой коллекции, когда вы используете all-delete-orphan.

Может ли кто-нибудь подтвердить, что, когда у вас есть такие объекты, как папки, содержащие папки или файлы, и вы перемещаете файл из одной папки в другую, вы не должны получать это исключение?

Я сделал образец проекта в vs2010, который демонстрирует это поведение. Может ли кто-нибудь сказать, правильны ли мои сопоставления или есть ошибка в nhibernate?

FileMapping.cs

public class FileMapping: ClassMap { 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 { 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. щелкните 1-ю кнопку: подключитесь к базе данных
  4. нажмите верхнюю правую кнопку, чтобы создать таблицы и образцы данных (2 объекта папки и 1 файл)
  5. нажмите кнопку, чтобы переместить объект файла в другой объект папки.
  6. нажмите кнопку, чтобы сохранить шансы: вы получите исключение DeletedObjectException

NHibernate имеет очень местный взгляд на сирот. Если объект перемещается из папки A в папку B папки A, считается сиротой и, следовательно, удаляет ее. Папка B хочет обновить объект и возник конфликт.

Это называется перевоспитанием, и вы читаете об этом здесь. http://fabiomaulo.blogspot.com/2009/09/nhibernate-tree-re-parenting.html

В принципе, это возможность переопределить то, что Orphan означает в вашей коллекции, чтобы ваши объекты не удалялись.