2009-09-04 12 views
1

J'utilise db4o pour une application simple, avec un db intégré. Lorsque je sauvegarde un objet, puis que je change d'objet, est-ce que db4o renvoie l'objet modifié?Mise à jour de l'objet Db4o

Voici le code:

[Test] 
    public void NonReferenceTest() 
    { 
     Aim localAim = new Aim("local description", null); 
     dao.Save(localAim); 

     // changing the local value should not alter what we put into the dao 
     localAim.Description = "changed the description"; 

     IQueryable<Aim> aims = dao.FindAll(); 

     var localAim2 = new Aim("local description", null); 
     Assert.AreEqual(localAim2, aims.First()); 
    } 

Le test échoue. Dois-je configurer le conteneur db4o d'une manière spéciale? l'envelopper dans les appels de validation? Merci

Répondre

1

En fait, il est censé fonctionner de cette façon. Vous devez garder à l'esprit que vous manipulez des objets et pas seulement des données.

Lors du stockage (ou de l'interrogation) d'un objet dans (ou à partir de) la base de données d'objets, il conserve le lien entre les données stockées et l'objet en mémoire. Cela est nécessaire lorsque vous mettez à jour l'objet et le stockez dans la base de données. En fait, vous ne voulez pas qu'un nouvel objet soit stocké mais vous voulez que l'ancien objet soit mis à jour. Ainsi, lors de la récupération d'un objet qui existe encore en mémoire, vous recevrez une référence à cet objet.

Une autre raison est l'intégrité des données. Regardez à nouveau votre code, et imaginez qu'il vous donne les données de la base de données et non pas une référence à l'objet mis à jour:

Aim localAim = new Aim("local description", null); 
dao.Save(localAim); 

// changing the local value should not alter what we put into the dao 
localAim.Description = "changed the description"; 

IQueryable<Aim> aims = dao.FindAll(); 

var localAim2 = aims.First(); 

// Assuption A: localAim2 != localAim 
localAim2.Description += " added s/t"; 

dao.Save(localAim); 
// with Assuption A you now have "changed the description" in database 
dao.Save(localAim2); 
// with Assuption A you now have "local description added s/t" 

Le problème avec Assuption A (! LocalAim2 = localAim) est que vous travaillez sur le même objet qui est stocké dans la base de données avec 2 contenus différents. Sans l'asservissement A (c'est-à-dire, localAim2 == localAim), vos données sont toujours cohérentes puisque vous n'avez qu'un seul objet (référencé deux fois).