异常“实例未处于有效状态”
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<Asset>().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() 清除它。回滚也是一样,要么开始一个新的会话,要么清除它并丢弃所有现有的对象,否则不一致会造成很多麻烦。
【讨论】:
以上是关于异常“实例未处于有效状态”的主要内容,如果未能解决你的问题,请参考以下文章