0

问题:

我收到错误:

批量更新从更新返回了意外的行数;实际行数: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();

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

映射:

这是通过代码映射

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子句忽略此异常对我来说不是解决方案。

编辑:

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

4

3 回答 3

2

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

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

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

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

于 2013-09-16T08:38:48.930 回答
0

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

catch (Exception ex)
{
    _session = _session.SessionFactory.OpenSession();
}

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

于 2013-09-16T10:14:01.187 回答
-1

这个问题来自SessionFactory

采用SessionFactory.SaveOrUpdate

于 2014-12-29T14:38:19.843 回答