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

Posted

技术标签:

【中文标题】如何解决“批量更新从更新返回意外的行数;实际行数:0;预期:1”问题?【英文标题】:How to solve "Batch update returned unexpected row count from update; actual row count: 0; expected: 1" problem? 【发布时间】:2011-05-04 06:13:05 【问题描述】:

每次我尝试创建特定实体时都会得到这个……只是想知道我应该如何找出原因。

我正在使用 Fluent NHibernate 自动映射,因此我可能没有适当地设置约定和/或需要覆盖一个或多个映射文件中的某些内容。我已经浏览了网络上有关此问题的许多帖子,并且很难弄清楚为什么会发生这种情况。

我要保存的对象非常简单。它是一个“Person”对象,它引用“Company”实体并具有“Address”实体的集合。 UPDATES 在数据库中已有的现有 Person 对象上工作正常。

有什么建议吗?

【问题讨论】:

【参考方案1】:

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

有多种原因,从不正确的映射到关闭行计数的 UPDATE/INSERT 触发器。

最好的办法是分析 SQL 语句并查看会发生什么。为此,请打开 nHibernate sql logging,或使用 sql profiler。一旦你有了 SQL,你可能知道原因,如果没有尝试手动运行 SQL,看看会发生什么。

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

【讨论】:

是的。就我而言,我使用的是 SharpArchitecture 框架,它将“Id”字段的未保存值默认为零……而不是我多年来习惯使用的 -1。我尝试在我的自动映射配置中甚至在自定义映射类中覆盖它......但仍将其设置为 0。 所以你尝试了这个:Id(a => a.Id).UnsavedValue(0);如果您仍有问题并希望我查看,请将生成的 SQL 和您的映射添加到您的问题中。 我遇到了这个问题,因为一个空对象被添加到一个集合中,然后保存。【参考方案2】:

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

SET NOCOUNT ON;

【讨论】:

【参考方案3】:

这可能是因为自动递增主键。为了解决这个问题,不要用数据集插入自动增量值。插入不带主键的数据。

【讨论】:

【参考方案4】:

当使用 INSTEAD OF 触发器定位视图时,几乎不可能获得正确的行数。在深入研究源代码后,我发现您可以制作一个自定义持久化器,使 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;
        
    

【讨论】:

您好,请问您是如何使用这个持久化器的?【参考方案5】:

如果您的行数大于 1,通常是因为您在具有相同 id 的表中有重复的行。检查您的表是否有重复记录。删除重复项将解决它。

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

【讨论】:

以上是关于如何解决“批量更新从更新返回意外的行数;实际行数:0;预期:1”问题?的主要内容,如果未能解决你的问题,请参考以下文章

如何解决 Ajax 跨域请求不到的问题

如何解决包冲突问题

如何解决包冲突问题

如何解决ajax跨域问题

MySQL 的 10048问题,如何解决?

如何解决smartgit的冲突问题