2010-10-08 130 views
0

有人可以爲我解釋這個嗎?在NHibernate中添加並保存不持久對象到持久對象

我有我的MSSQL數據庫標準關係:

[item] 
id 
symbol 

[item_version] 
id 
item_id (fk) 
symbol 

在[項目]映射存在與級聯= 「全」 和many-to-之一[item_version]映射標準item_version BAG。

這是測試用例:

[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); 
    } 

測試失敗,當我加入NEW ItemVersion對象從DB採取Item對象(如上編碼的)。

當我添加新的ItemVersions新項目,並調用保存項目 - 一切工作正常。這是爲什麼?

+0

我想補充一點,AddItemVersion()方法處理設置回參考ItemVersion對象項目,所以這是沒有問題的。 – Adam 2010-10-08 08:31:23

+0

當我調用Session.Flush()而不是Item.Dao.SaveOrUpdate(itemFromDb)時 - 一切工作正常!爲什麼Flush()將新的子對象保存到數據庫並且在父對象上調用SaveOrUpdated()不會那麼做!? – Adam 2010-10-08 13:17:09

回答

0

保存/更新/刪除/ etc方法不會將更改持久化到數據庫;他們只在工作單元(會話)中排隊某些動作

實際上,甚至不需要調用其中的任何一個來修改持久對象:這會在Flush上自動發生(其中,順便說一句,牛逼的調用明確:改用事務)

更多信息:http://nhibernate.info/doc/nh/en/index.html#manipulatingdata

+0

謝謝,現在我已經明白了:) – Adam 2010-10-10 17:38:58