Я использую (свободно) nhibernate и столкнулся с небольшой проблемой. Моя модель данных состоит в том, чтобы иметь пользовательский объект со ссылкой «один ко многим» на другой объект (я назову его «Obj1»).
Obj1 имеет первичный ключ, который является внешним по отношению к моему приложению. Хотя я мог бы изменить его на собственный первичный ключ и, следовательно, разрешить дублирование, позже это вызовет больше проблем.
Пользователь может добавлять и удалять Obj1 из своего профиля в любое время, и слой данных вызывается сразу после выполнения каждого действия. Проблема в том, что если пользователь добавляет Obj1, удаляет его, а затем добавляет его снова, тогда nhibernate дает мне исключение NonUniqueObjectException.
Это потому, что первый добавленный объект Obj1 все еще зависает в сеансе nhibernate. Кажется, есть несколько решений для этого:
- Очистить сеанс и перезагрузить пользовательский объект при появлении обновлений.
- Отсюда: nhibernate: другой объект с таким же значением идентификатора уже был связан с сеансом: 2, объекта: - исключать пользовательский объект из кэша сеанса после каждого обновления.
- Переписать экран, позволяющий пользователю управлять объектами Obj1, чтобы он вызывал слой данных только при выходе из экрана.
1 и 2 проще, но оба кажутся немного взломанными. 3 выглядит как «правильное» решение, но означает, что в будущем я могу столкнуться с той же проблемой в более трудной для решения области.
Итак, вопрос в том, что лучше и почему? Являются ли какие-либо из этих решений действительно плохими по какой-то причине? (Например, попытка микроуправления кешем nhibernate мне кажется плохой идеей.)
Примечание: как ни странно, написав это, я перешел от полной неуверенности к убежденности в том, что 3 - лучший путь. Мне все еще было бы интересно услышать другие точки зрения.