У объекта данных Nhibernate есть объект, добавленный, удаленный, затем добавленный - PullRequest
0 голосов
/ 06 марта 2012

Я использую (свободно) nhibernate и столкнулся с небольшой проблемой. Моя модель данных состоит в том, чтобы иметь пользовательский объект со ссылкой «один ко многим» на другой объект (я назову его «Obj1»). Obj1 имеет первичный ключ, который является внешним по отношению к моему приложению. Хотя я мог бы изменить его на собственный первичный ключ и, следовательно, разрешить дублирование, позже это вызовет больше проблем.

Пользователь может добавлять и удалять Obj1 из своего профиля в любое время, и слой данных вызывается сразу после выполнения каждого действия. Проблема в том, что если пользователь добавляет Obj1, удаляет его, а затем добавляет его снова, тогда nhibernate дает мне исключение NonUniqueObjectException.

Это потому, что первый добавленный объект Obj1 все еще зависает в сеансе nhibernate. Кажется, есть несколько решений для этого:

  1. Очистить сеанс и перезагрузить пользовательский объект при появлении обновлений.
  2. Отсюда: nhibernate: другой объект с таким же значением идентификатора уже был связан с сеансом: 2, объекта: - исключать пользовательский объект из кэша сеанса после каждого обновления.
  3. Переписать экран, позволяющий пользователю управлять объектами Obj1, чтобы он вызывал слой данных только при выходе из экрана.

1 и 2 проще, но оба кажутся немного взломанными. 3 выглядит как «правильное» решение, но означает, что в будущем я могу столкнуться с той же проблемой в более трудной для решения области.

Итак, вопрос в том, что лучше и почему? Являются ли какие-либо из этих решений действительно плохими по какой-то причине? (Например, попытка микроуправления кешем nhibernate мне кажется плохой идеей.)

Примечание: как ни странно, написав это, я перешел от полной неуверенности к убежденности в том, что 3 - лучший путь. Мне все еще было бы интересно услышать другие точки зрения.

1 Ответ

0 голосов
/ 07 марта 2012

Я добавил модульный тест в репозиторий, чтобы воспроизвести эту проблему, и, к моему удивлению, он работал нормально.Через несколько минут я обнаружил реальную проблему - я не настаивал на удалении Obj1 на слой данных.Как только я это сделал, все работало нормально.

Ну да, по крайней мере, это спасло мне намного больше работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...