如何解决“批量更新从更新返回意外的行数;实际行数: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”问题?的主要内容,如果未能解决你的问题,请参考以下文章