在NHibernate中添加并保存不持久对象到持久对象
问题描述:
有人可以为我解释这个吗?在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新项目,并调用保存项目 - 一切工作正常。这是为什么?
答
保存/更新/删除/ etc方法不会将更改持久化到数据库;他们只在工作单元(会话)中排队某些动作
实际上,甚至不需要调用其中的任何一个来修改持久对象:这会在Flush上自动发生(其中,顺便说一句,牛逼的调用明确:改用事务)
更多信息:http://nhibernate.info/doc/nh/en/index.html#manipulatingdata
+0
谢谢,现在我已经明白了:) – Adam 2010-10-10 17:38:58
我想补充一点,AddItemVersion()方法处理设置回参考ItemVersion对象项目,所以这是没有问题的。 – Adam 2010-10-08 08:31:23
当我调用Session.Flush()而不是Item.Dao.SaveOrUpdate(itemFromDb)时 - 一切工作正常!为什么Flush()将新的子对象保存到数据库并且在父对象上调用SaveOrUpdated()不会那么做!? – Adam 2010-10-08 13:17:09