Свободное перемещение исключений NHibernate между коллекциями - PullRequest
3 голосов
/ 26 мая 2011

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

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

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

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

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

1 Ответ

2 голосов
/ 10 августа 2011

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

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

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

...