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).