2010-02-26 3 views
1

Я новичок в db4o.db4o объект обновление дилемма

У меня есть этот вопрос в виду: , когда объект извлекается из DAL, возможно, он будет обновляться в бизнес-слое, то мы потеряли это оригинальное свойство, поэтому, когда дело доходит до обновления, как я могу узнать, какой из них является оригинальным объект в базе данных для обновления?

ответ

2

Вы должны быть более точными относительно «объекта». Если изменить свойства экземпляра объекта, в просто хранить его снова выполнить обновление:

MyClass someInstance = ObjectContainer.Query<MyClass>().FirstOrDefault(); 
someInstance.Name = "NewName"; 
someInstance.PhoneNumber = 12132434; 
ObjectContainer.Store(someInstance); // This is the update call 

[Это просто псевдо-код]

Так что вам не нужно, чтобы соответствовать объекты друг к другу, как вы при использовании СУБД.

Однако вам необходимо убедиться, что вы не используете другой экземпляр объекта ObjectContainer, потому что другой контейнер не будет знать, что эти объекты являются одним и тем же экземпляром (поскольку в них нет поля идентификатора).

Ваша архитектура приложения должна помочь сделать это для большинства рабочих процессов, поэтому должно быть действительно только одно IObjectContainer. Только если временные интервалы очень длинные (например, вам нужно сохранить ссылку на объект в другой базе данных и каким-то образом обработать его), он будет использовать UUID. Как вы уже указывали, для этого требуется хранить идентификатор где-то еще и, следовательно, усовершенствовать вашу архитектуру.

Если вы, однако, собираетесь создать новый объект и «перезаписать» старый объект, все будет несколько сложнее из-за других объектов, которые могут ссылаться на него. Однако это хаотичный патологический случай и обычно должен обрабатываться в самой модели домена, например. путем копирования данных объекта с одного объекта на другой.

+0

Итак, предлагаете ли вы, чтобы я открывал базу данных во время работы приложения так что у меня будет только один экземпляр объекта ObjectContainer? – Benny

+0

По существу, да. Идея состоит в том, что ObjectContainer отвечает за сохранение идентификаторов объектов. Поэтому, когда вы закрываете контейнер, вы теряете эту информацию. В отличие от типичной РСУБД, где вы открываете/закрываете соединения как можно быстрее, контейнеры db4o должны оставаться открытыми все время, когда вам потенциально нужен доступ к вашей модели данных. В веб-приложении, например, вы откроете соединение по запросу и закроете его, когда запрос будет завершен. В настольном приложении вы можете оставить экземпляр открытым еще дольше. Обратите внимание, что он держит ссылки! – mnemosyn

2

Вы должны загрузить объект через его ID:

objectContainer.get().ext().getByID(id); 

или через его UUID:

objectContainer.get().ext().getByUUID(uuId); 

See the docs для последней. Для пояснения см. Ответ here или документы here. Вкратце используйте uuid только для долгосрочных ссылок.

+0

тогда мне нужно будет хранить идентификатор объекта, извлеченного из db где-нибудь? – Benny

+0

hmmh, да. Я не знаю, какую архитектуру вы используете, но обычно идентификаторы хранятся в сеансе вместо всего объекта, и объекты снова загружаются из своего идентификатора при следующем запросе. Но, как уже указывал мнемосин, вам обычно не нужны идентификаторы, пока вы ссылаетесь на один и тот же объект (db4o будет делать обновление). Возможно, вы можете дать нам код с проблемами, которые у вас есть. – Karussell

+0

, как указал мнемосин, до тех пор, пока экземпляр объекта и экземпляр объекта ObjectContainer являются одним и тем же, обновление объекта легко, поэтому, это означает, что мне нужно держать базу данных открытой в течение всего срока службы моего приложения? то это так отличается от того, как мы используем СУБД, coz, RDBMS обычно открывают только базу данных для CRUD и сразу же закрывают ее. – Benny

Смежные вопросы