2010-10-08 8 views
0

Quelqu'un pourrait-il expliquer cela pour moi?Ajouter et enregistrer des objets non persistants à un objet persistant dans NHibernate

J'ai relations standard dans mon MSSQL DB:

[item] 
id 
symbol 

[item_version] 
id 
item_id (fk) 
symbol 

Dans la cartographie [point] il y a un sac standard item_version avec cascade = "all" et beaucoup à un dans la cartographie [item_version].

Tel est le cas de l'essai:

[Test] 
    public void AddNewVersionToPersistentObject() 
    { 
     //creating item 
     Item i = new Item(); 
     i.Symbol = "Item 1 symbol";  

     //saving item 
     Item.Dao.Save(i); 
     long id = i.Id; 

     //clearing session and getting item back from DB 
     DataHelper.DaoFactory.ClearSession(); 
     Item itemFromDb = Item.Dao.GetById(id); 

     //creating new versions 
     ItemVersion v1 = new ItemVersion(); 
     v1.Symbol = "version 1 symbol"; 

     ItemVersion v2 = new ItemVersion(); 
     v2.Symbol = "version 2 symbol"; 

     //adding versions and saving item 
     itemFromDb.AddItemVersion(v1); 
     itemFromDb.AddItemVersion(v2); 
     Item.Dao.SaveOrUpdate(itemFromDb); 


     //clearing session, getting back item and checking results 
     DataHelper.DaoFactory.ClearSession(); 
     Item itemFromDb2 = Item.Dao.GetById(id); 
     Assert.AreEqual(2, itemFromDb2.ItemVersions.Count); 
    } 

test échoue, quand j'ajoutant NOUVEAUX ItemVersion objets à l'objet de l'objet pris à partir de DB (comme code ci-dessus).

Lorsque j'ajoute de nouvelles ItemVersions à un nouvel élément et que j'appelle Enregistrer sur l'élément - tout fonctionne correctement. Pourquoi donc?

+0

Je voudrais ajouter que la méthode gère AddItemVersion() Retour au réglage référence au point dans l'objet ItemVersion, donc ce n'est pas la question. – Adam

+0

Lorsque j'appelle Session.Flush() au lieu de Item.Dao.SaveOrUpdate (itemFromDb) - tout fonctionne bien aussi! Pourquoi Flush() enregistre de nouveaux objets enfants dans DB et SaveOrUpdated() appelé parent ne le fait pas !? – Adam

Répondre

0

Les méthodes Enregistrer/Mettre à jour/Supprimer/etc ne persistent pas les modifications apportées à la base de données; ils ne mettent en file d'attente que certaines actions dans l'unité de travail (la session)

En fait, vous n'avez même pas besoin d'appeler l'un d'entre eux pour modifier les objets persistants: cela se produit automatiquement sur Flush (ce qui, BTW, vous ne devriez pas appel t explicitement: utiliser une transaction à la place)

Plus d'infos: http://nhibernate.info/doc/nh/en/index.html#manipulatingdata

+0

Merci, maintenant j'ai compris :) – Adam

Questions connexes