在NHibernate中向持久对象添加并保存非持久对象

时间:2010-10-08 07:54:44

标签: c# .net nhibernate

有人可以帮我解释一下吗?

我在MSSQL DB中有标准关系:

[item]
id
symbol

[item_version]
id
item_id (fk)
symbol

在[item]映射中,有一个标准的item_version BAG,其中cascade =“all”,并且在[item_version]映射中是多对一的。

这是测试用例:

    [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添加到新Item并调用Save on Item时 - 一切正常。这是为什么?

1 个答案:

答案 0 :(得分:0)

保存/更新/删除/ etc方法不会持久更改数据库;他们只在工作单元(会话)中排队某些行动

实际上,你甚至不需要调用它们中的任何一个来修改持久对象:这在Flush上自动发生(顺便说一下,你不应该明确调用它:改为使用事务)

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