异常“实例未处于有效状态”

Posted

技术标签:

【中文标题】异常“实例未处于有效状态”【英文标题】:Exception "instance was not in a valid state" 【发布时间】:2012-10-29 12:22:38 【问题描述】:

这是一个示例代码。我在哪里做一些测试

    获取实体 删除实体 回滚事务。 更改实体 刷新实体 获取实体

我在执行以下代码时遇到此异常:实例未处于有效状态

        ISession session = sessionFactory.OpenSession();
        var list1 = session.Query<Asset>().ToList();

        ITransaction transaction = session.BeginTransaction();

        session.Delete(list1[0]);

        transaction.Rollback();
        transaction.Dispose();

        list1[0].Name = "Test";
        session.Refresh(list1[0]);
        var list2 = session.Query<Asset>().ToList();

如果我两次调用刷新。它没有任何问题。它工作正常。

        try
        
            session.Refresh(list1[0]);
        
        catch (Exception)
        
            session.Refresh(list1[0]);
        

能否请您告诉我您对这里有什么问题的看法和建议。

【问题讨论】:

您应该将初始对象查询var list1 = session.Query&lt;Asset&gt;().ToList(); 移动到事务内部。此外,您应该使用Using 语句来处理事务范围,并且在结束之前不要提交/回滚。 感谢 Origin 提供您的建议,但它不起作用。 你能根据 Origins 的建议发布你的新代码吗? 我做了修改,ISession session = sessionFactory.OpenSession(); var list1 = session.Query().ToList();使用 (ITransaction transaction = session.BeginTransaction()) session.Delete(list1[0]); list1[0].Name = "测试"; var list2 = session.Query().ToList(); 【参考方案1】:

我认为问题在于您对回滚和异常的处理。在回滚或异常之后,对象的内存状态可能不再与其持久状态一致,因此如果不进行任何清理,会话将不再安全使用。建议发生异常后,您应该回滚任何事务,然后丢弃会话,或者使用 session.Clear() 清除它。回滚也是一样,要么开始一个新的会话,要么清除它并丢弃所有现有的对象,否则不一致会造成很多麻烦。

【讨论】:

以上是关于异常“实例未处于有效状态”的主要内容,如果未能解决你的问题,请参考以下文章

Kubernetes 集群状态异常排错

求解,各种属性的异常状态是啥,在哪看

delphi exe异常关闭,怎么获取异常关闭状态

auth返回状态码异常

异常和状态管理

第二十章 异常和状态管理