Nhibernate:处理 ITransaction 异常,以便新事务可以继续使用相同的 ISession

标签 nhibernate

我有一个我想使用 NHibernate 插入/更新到数据库的 10 个数据对象的列表。如果一个抛出异常(比如主键冲突),我仍然想插入/更新另一个 9. 我将每个对象操作滚动到它自己的原子事务中,如果有异常则回滚事务。问题是,如果事务确实导致异常并回滚,则在下一个事务中 Nhibernate 会提示错误:Nexus.Data.PortfolioCorporateEntity 条目中的 null id (异常发生后不要刷新Session)

我的主程序很简单。它从 sessionfactory 创建一个 session ,创建数据访问层,对数据对象做一些工作,然后尝试将这些数据对象持久化到数据库中。

    sessionsManager = new NHibernateSessionManager();
        session = sessionsManager.GetSession();
        DALC = new NHibernateDataProvider(session);

        …

        foreach (var pce in pces)
        {
            try
            {
                DALC.UpdateOrAddObject<PortfolioCorporateEntity>(pce);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Could not add Corporate Entity ID " + pce.CorporateEntity.CorporateEntityID.ToString());
            }

        }

这是我的 Nhibernate 数据访问层中的 updateOrAdd 过程,为 10 个对象调用了 10 次。
public void UpdateOrAddObject<T>(T workObject) 
{ 
    using (ITransaction tx = mSession.BeginTransaction) { 
        try { 
            mSession.SaveOrUpdate(workObject); 
            mSession.Flush(); 
            tx.Commit(); 
        } 
        catch (Exception ex) { 
            tx.Rollback(); 
            throw;
        } 
    } 
} 

为了说明这一点, session 由调用程序实例化并传递给数据访问层对象,其构造函数如下。
public NHibernateDataProvider(ISession session) 
{ 
    mSession = session; 
} 

这工作正常,除非在异常之后,它说在异常之后不要刷新 session 。我不知道为什么 - 事务被很好地回滚并且数据库应该准备好接受另一个事务不是吗?我究竟做错了什么?

最佳答案

抛出异常后,不可能重新使用 NHibernate session 。 Quoting the documentation :

If the ISession throws an exception you should immediately rollback the
transaction, call ISession.Close() and discard the ISession instance.
Certain methods of ISession will not leave the session in a consistent state.

所以答案是你不能做你想做的事。您需要创建一个新 session 并在那里重新尝试更新。

关于Nhibernate:处理 ITransaction 异常,以便新事务可以继续使用相同的 ISession,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/493660/

相关文章:

nhibernate - nHibernate 升级到 3.3 时出现问题

.net - 在 .NET 中修复 dll 版本问题的提示

NHibernate 属性访问策略,如何设置以便首选 field.camelcase-underscore 但 autoproperty 会回退

c# - 错误的连接字符串 NHibernate 3.3

c# - Fluent NHibernate 日期时间 UTC

database - 使用 nhibernate 跨数据库加入

java - 更新用户时,删除的对象将通过级联重新保存(从关联中删除删除的对象)

nhibernate - 复杂对象的 Fluent NHibernate N+1 问题

c# - 删除和添加相同数据库后未创建 Fluent Nhibernate 映射

c# - 这里的每个人都在跳上 ORM 潮流吗?