2010-10-08 120 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