休眠对象的休眠顺序

时间:2019-12-04 19:32:21

标签: c# nhibernate fluent-nhibernate

我正在使用一个或多个实体的服务,该实体已从文件中反序列化。 这些实体可能有关系也可能没有关系。 有什么简单的方法可以确保Nhibernate在调用保存实体时以正确的顺序处理实体? 现在,我正在使用session.Save(entity)进行操作,但是它有时可能会以“属性指向瞬态或null值..”的例外而结束。

1 个答案:

答案 0 :(得分:0)

通常,不,NHibernate将自动为您管理它,因为它被认为是安全的方法。有两种选择:

第一个选项:您可以执行Flush方法,并确保已在数据库上执行了该方法。例如:

using (var session = sessionFactory.OpenSession())
{
    using (var transaction = session.BeginTransaction())
    {
        try
        {
            foreach (var item1 in data1)
            {
                session.Save(item1);
            }
            session.Flush(); // execute all the queries for the itens (1)

            foreach (var item2 in data2)
            {
                session.Save(item2);
            }
            session.Flush(); // execute all the queries for the itens (2)

            transaction.Commit();
        }
        catch (Exception e)
        {   
            transaction.RollBack();
            // do some log with `e` exception reference
        }
    }
}

第二个选项。如果只需要在没有任何状态管理的情况下将其发送到数据库,则可以使用ISessionStateless而不是传统的ISession。您将失去NHibernate自动执行的所有会话状态管理。 (延迟加载,第一级/第二级缓存等)。您只需调用诸如InsertDeleteUpdate之类的方法即可。重要提示:StatelessSession可以提高性能,并确保它适合您的情况:

https://nhibernate.info/doc/nhibernate-reference/batch.html