我将描述的设计违反了某种方式的良好实践设计,但我仍然对这个问题出现的原因以及如何绕过这个问题感兴趣。我找到了一些使用NHibernate和Update或Select触发器可能发生的问题的描述,但是我无法找到我面临的问题。
我有一个表和类映射到它,名为Bucket:
public class Bucket
{
public virtual int Id;
public virtual int OrderCount;
}
<class name="Bucket" table="Bucket">
<id name="Id">
<generator class="native" />
</id>
<property name="OrderCount" />
和班级订单
public class Order
{
public virtual int Id{get;set;}
public virtual int BucketId{get;set;}
}
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="..."
namespace="...
<class name="Order" table="Order">
<id name="Id">
<generator class="native" />
</id>
<property name="BucketId" />
</hibernate-mapping>
还有两个触发器分别在每次插入或删除时按特定存储桶ID计数订单,并在存储桶表中更新存储桶的特定ID的订单数量。
问题是在测试运行期间,如果我删除订单并刷新会话,则抛出以下消息的异常: NHibernate.AdoNet.TooManyRowsAffectedException:意外的行数:2;预期:1
这可能是在删除订单后立即触发执行造成的。
PS: Trigger正在计算订单记录并更新 Read Commited 隔离级别中的Bucket记录。
答案 0 :(得分:2)
如果您正在使用SQL Server,则触发器中的SET NOCOUNT ON将起作用。