删除后休眠意外行数上升

Posted

技术标签:

【中文标题】删除后休眠意外行数上升【英文标题】:Nhibernate unexpected row count rising after deletes 【发布时间】:2013-09-16 08:21:23 【问题描述】:

问题:

我收到错误:

批量更新从更新返回了意外的行数;实际行 计数:0;预计:1

当某个实体在 fetch 和 delete 之间被删除时。在任何下一个删除行计数和预期上升之后,例如:

批量更新从更新返回了意外的行数;实际行 计数:11;预计:12

代码:

var queueEntry = _session.Query<MyTable>().FirstOrDefault(x => x.Id == id);
if (queueEntry != null)

    _session.Delete(queueEntry);

    try
    
        _session.Flush();
    
    catch (Exception ex)
    
        _session.Clear();
    

    return 1;

尝试:

我尝试了一些没有成功的事情,我在catch 子句中添加了这行:

_session.Disconnect();
_session.Reconnect();

我试图用事务来包装我放在这里的整个代码,而不是 _session.Flush() 我放 transaction.Commit()

映射:

这是mapping by code

public class MyTable : IEntity

    public virtual int Id  get; protected set; 
    public virtual string Type  get; set; 
    public virtual string Source  get; set; 
    public virtual string OperationType  get; set; 
    public virtual bool IsVisible  get; set; 
    public virtual DateTime? Timestamp  get; set; 
    public virtual string ContentId  get; set; 
    public virtual int Priority  get; set; 

问题:

有没有办法重置这个expected 值,这样我就可以继续删除值而没有例外?

当然,实体已从表中删除,但我不断收到异常。使用空的catch 子句忽略此异常对我来说不是解决方案。

编辑:

附加信息:该表是长时间运行进程的队列,它没有子表,只有一些对服务有用的东西。发布映射。它会在一段时间后发生,而不是在第一次删除之后发生。

【问题讨论】:

为什么没有Session.Get的条目? @AlessandroD'Andria 在这种情况下没有任何区别,但感谢您的提示。 这个实体有孩子吗?你能告诉我们你的映射吗? @SimonWhitehead 这个实体没有任何子实体,我会发布我的映射 @SimonWhitehead 我正在使用代码映射lycog.com/programming/nhibernate-32-mapping-code-basic-mapping 【参考方案1】:

通常这个错误表示SQL语句执行成功,但是SQL Server返回的ROWCOUNT是0,而不是预期的1。

这可能有多种原因,例如不正确的映射、关闭了行计数的触发器。

通过查看sql server中执行的SQL语句,您将能够清楚地了解该问题。可以通过打开 nHibernate sql 日志记录或使用 sql profiler 来完成。获得 SQL 后,您可能会知道原因,如果没有,请尝试手动运行 SQL 看看会发生什么。

此外,如果您可以发布地图,它将帮助人们发现任何问题

【讨论】:

【参考方案2】:

我已经管理了一些解决方案,也许不是最好的,但可以工作:

catch (Exception ex)

    _session = _session.SessionFactory.OpenSession();

如果打开新会话,它会丢失有关行数的信息,并且下次可以正常工作。

【讨论】:

【参考方案3】:

这个问题来自SessionFactory

使用SessionFactory.SaveOrUpdate

【讨论】:

以上是关于删除后休眠意外行数上升的主要内容,如果未能解决你的问题,请参考以下文章

无法更新记录休眠

休眠异常:意外令牌:HAVING

为啥休眠在获取较少行数时较慢?

休眠和子树异常的意外结束

休眠错误消息:意外令牌:NULLS(脚本文件行中的错误:13 意外令牌:NULLS)

删除和重新创建数据库后强制休眠创建表