2010-02-26 11 views
1

Je suis nouveau à db4o.db4o objet mise à jour dilemme

J'ai cette question à l'esprit: lorsque l'objet est récupéré à partir DAL, peut-être il mettra à jour dans la couche d'affaires, alors nous avons perdu sa propriété d'origine, donc en ce qui concerne la mise à jour comment puis-je savoir que l'on est l'original objet dans la base de données à mettre à jour?

Répondre

2

Vous devez être plus précis sur "l'objet". Si vous modifiez les propriétés d'instance d'objet, il suffit de le stocker sera à nouveau effectuer une mise à jour:

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

[Ceci est juste pseudo-code]

Vous n'avez pas besoin de faire correspondre les objets les uns aux autres que vous devrait lors de l'utilisation d'un SGBDR.

Cependant, vous devez vous assurer que vous n'utilisez pas une instance différente de ObjectContainer, car un conteneur différent ne saura pas que ces objets sont la même instance (puisqu'il n'y a pas de champ ID dans ceux-ci).

Votre architecture d'application devrait vous aider à faire cela pour la plupart des flux de travail, donc il ne devrait y en avoir qu'un seul autour de IObjectContainer. Seulement si les périodes sont vraiment longues (par exemple, vous devez stocker une référence à l'objet dans une base de données différente et la traiter d'une manière ou d'une autre), il utilisera l'UUID. Comme vous l'avez déjà souligné, cela nécessite de stocker l'ID ailleurs et par conséquent complexifie votre architecture.

Si vous avez toutefois l'intention de créer un nouvel objet et d '«écraser» l'ancien objet, les choses deviennent un peu plus compliquées à cause d'autres objets qui pourraient s'y référer. Cependant, il s'agit d'un cas pathologique d'un certain type et il devrait normalement être traité dans le modèle de domaine lui-même, par ex. en copiant des données d'objet d'un objet à un autre.

+0

alors, suggérez-vous que je garde la base de données ouverte pendant le fonctionnement de l'application de sorte que je n'aurai qu'une seule instance de ObjectContainer? – Benny

+0

Essentiellement, oui. L'idée est que ObjectContainer est responsable de la conservation des identités d'objet. Par conséquent, chaque fois que vous fermez un conteneur, vous perdez cette information. Contrairement au SGBDR classique, où vous ouvrez/fermez les connexions le plus rapidement possible, les conteneurs db4o doivent rester ouverts tout le temps où vous avez potentiellement besoin d'accéder à votre modèle de données. Dans une application Web, par exemple, vous pouvez ouvrir la connexion à la demande et la fermer lorsque la requête est terminée. Dans une application de bureau, vous pouvez conserver l'instance ouverte encore plus longtemps. Notez qu'il garde des références! – mnemosyn

2

Vous devez charger l'objet via son ID:

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

ou via son UUID:

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

See the docs pour le second. Pour une explication, voir la réponse here ou les documents here. En bref utiliser uuid seulement pour le référencement à long terme.

+0

alors je vais devoir stocker l'ID de l'objet récupéré de DB quelque part? – Benny

+0

hmmh, oui. Je ne connais pas l'architecture que vous utilisez, mais les ID sont généralement stockés dans la session au lieu de l'objet entier et les objets sont à nouveau chargés à partir de leur identifiant lors de la prochaine requête. Mais comme mnemosyn l'a déjà signalé: vous n'aurez généralement pas besoin d'identifiants tant que vous faites référence au même objet (db4o fera alors la mise à jour). Peut-être pourriez-vous nous donner un code avec les problèmes que vous avez. – Karussell

+0

comme l'a souligné mnemosyn, tant que l'instance d'objet et l'instance ObjectContainer sont les mêmes, la mise à jour de l'objet est facile, est-ce que cela signifie que je dois garder la base de données ouverte pendant la durée de vie de mon application? alors cela est si différent de la façon dont nous utilisons RDBMS, coz, RDBMS normalement seulement ouvrir la base de données pour CRUD, et fermez-le tout de suite. – Benny