如何解决“批量更新从更新返回意外行数;实际行数:0;预期:1”问题?

时间:2010-11-03 00:50:34

标签: nhibernate fluent-nhibernate automapping

每当我尝试创建一个特定的实体时获取此信息...只是想知道我应该如何找出原因。

我正在使用Fluent NHibernate自动化,所以也许我没有适当地设置约定和/或需要覆盖一个或多个映射文件中的某些东西。我已经通过网络上的一些关于这个问题的帖子,并且很难弄清楚为什么会发生这种情况。

我正在保存的对象非常简单。它是一个引用“公司”实体并具有“地址”实体集合的“人”对象。 UPDATES在已存在于数据库中的现有Person对象上正常工作。

建议?

谢谢-wg

5 个答案:

答案 0 :(得分:27)

错误表示正在执行SQL INSERT语句,但SQL Server在运行后返回的ROWCOUNT为0,而不是预期的1。

有多种原因,从错误的映射到关闭rowcount的UPDATE / INSERT触发器。

最好的方法是分析SQL语句,看看会发生什么。要做到这一点,请打开nHibernate sql logging,或使用sql探查器。一旦你有了SQL,你可能知道原因,如果没有尝试手动运行SQL,看看会发生什么。

另外,我建议您发布您的地图,因为它可以帮助人们发现任何问题。

答案 1 :(得分:12)

当触发器执行影响行计数的其他DML(数据修改)查询时,可能会发生这种情况。我的解决方案是在触发器的顶部添加以下内容:

SET NOCOUNT ON;

答案 2 :(得分:2)

由于自动增量主键,可能会发生这种情况。要解决此问题,请勿使用数据集插入自动增量值。插入没有主键的数据。

答案 3 :(得分:0)

使用INSTEAD OF触发器定位视图时,几乎不可能获得正确的行数。在钻研了一下之后,我发现你可以制作一个自定义的persister,这使得NHibernate忽略了计数检查。

public class SingleTableNoResultCheckEntityPersister : SingleTableEntityPersister
{
    public SingleTableNoResultCheckEntityPersister(PersistentClass persistentClass, ICacheConcurrencyStrategy cache, ISessionFactoryImplementor factory, IMapping mapping)
        : base(persistentClass, cache, factory, mapping)
    {
        for (int i = 0; i < this.insertResultCheckStyles.Length; i++)
        {
            this.insertResultCheckStyles[i] = ExecuteUpdateResultCheckStyle.None;
        }

        for (int i = 0; i < this.updateResultCheckStyles.Length; i++)
        {
            this.updateResultCheckStyles[i] = ExecuteUpdateResultCheckStyle.None;
        }

        for (int i = 0; i < this.deleteResultCheckStyles.Length; i++)
        {
            this.deleteResultCheckStyles[i] = ExecuteUpdateResultCheckStyle.None;
        }
    }
}

答案 4 :(得分:0)

如果行数大于 1,通常是因为表中有重复的行且 ID 相同。检查您的表是否有重复的记录。删除重复项即可解决问题。

<块引用>

NHibernate.AdoNet.TooManyRowsAffectedException: '批量更新返回 来自更新的意外行数;实际行数:2;预期:1'

相关问题