2
NHibernate version: 3.3.2.

我有一个包含多个操作的 NHibernate 事务。作为事务中的中间步骤之一,我尝试通过 Session.Save 插入一个具有自动增量 PK 的新实体实例。

在某些情况下,由于违反的外键值导致插入错误。我捕获异常以进行一些日志记录并忽略它,假设插入尚未完成并继续执行以下步骤。这是功能要求,无法更改。根据性能要求,在插入之前验证值也不是可接受的解决方案。

我的问题:非持久化实体已添加到 NH 会话缓存中,但 ID 为空。所以我稍后在做一些其他的 NH 操作时得到这个异常:

NHibernate.AssertionFailure: null id in MyApp.MyPackage.MyClass entry (don't flush the Session after an exception occurs)

我的问题:我怎样才能把这个烦人的“僵尸”实体从会话中拉出来,这样我才能在所有步骤结束时成功提交事务?

我不能驱逐它,因为 ID 是空的。

我试了一下,得到了以下异常:

System.InvalidOperationException: cannot generate an EntityKey when id is null

我不能进行Clear()当前会话,因为我正处于事务中间,并且要保留一些先前和后续步骤。

我得到的原始异常有点令人困惑,并且被抛出与真正问题的起源不同的地方。这个链接给了我一些信息来弄清楚发生了什么:NHibernate - null id in entry(发生异常后不要刷新会话)

4

2 回答 2

0

根据NHibernate 手册,9.8。异常处理

如果 ISession 抛出异常,您应该立即回滚事务,调用 ISession.Close() 并丢弃 ISession 实例。ISession 的某些方法不会使会话保持一致状态。

我想您必须重新启动整个交易。

于 2013-11-29T11:37:32.860 回答
0

尽管它很糟糕,但我已经能够通过将我的zombie.discard() 包装在“try/catch”中来解决这个问题,当我这样做时,它会抑制你的.object 条目中更糟糕的“null id”(发生异常后不要刷新会话)”

我觉得脏。

于 2013-08-06T02:36:25.223 回答