Это действительно выглядит как транзакция для меня.
Как сказал Герман, вам придется удалить старое, сохранить и назначить новое и убедиться, что эти шаги можно выполнить за один раз.
В СУБД для этого вам также потребуется выполнить транзакцию. Однако многие системы РСУБД поддерживают вас здесь с помощью триггеров и событий. Обратите внимание, что db4o также предлагает определенные обратные вызовы.
В настоящее время я работаю над абстракцией ref-count для таких случаев, как это сложно сделать в общем. С другой стороны, вы можете написать специальный метод Update
, который упростит транзакцию для вас и сравнит ссылки на старые и новые объекты. Если они не совпадают, и вы можете быть уверены, что никто другой не ссылается на этот тип объекта адреса, вы можете удалить его.
Также обратите внимание, что если бы вы использовали язык без сборки мусора, вам также пришлось бы отслеживать это вручную и удалять старый объект.
Эта концепция «совокупного корня» мне кажется очень расплывчатой - в конце концов, это зависит от перспективы, но это другая проблема.