每当我尝试创建一个特定的实体时获取此信息...只是想知道我应该如何找出原因。
我正在使用Fluent NHibernate自动化,所以也许我没有适当地设置约定和/或需要覆盖一个或多个映射文件中的某些东西。我已经通过网络上的一些关于这个问题的帖子,并且很难弄清楚为什么会发生这种情况。
我正在保存的对象非常简单。它是一个引用“公司”实体并具有“地址”实体集合的“人”对象。 UPDATES在已存在于数据库中的现有Person对象上正常工作。
建议?
谢谢-wg
答案 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'