我正在使用一个或多个实体的服务,该实体已从文件中反序列化。
这些实体可能有关系也可能没有关系。
有什么简单的方法可以确保Nhibernate在调用保存实体时以正确的顺序处理实体?
现在,我正在使用session.Save(entity)
进行操作,但是它有时可能会以“属性指向瞬态或null值..”的例外而结束。
答案 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自动执行的所有会话状态管理。 (延迟加载,第一级/第二级缓存等)。您只需调用诸如Insert
,Delete
,Update
之类的方法即可。重要提示:StatelessSession
可以提高性能,并确保它适合您的情况: