Дизайн, который я опишу, каким-то образом нарушает дизайн хороших практик, но все же меня интересует, почему возникает эта проблема и как ее можно обойти. Я нашел описание проблем, которые могут возникнуть при использовании триггеров 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>
Есть также два триггера, которые подсчитывают Order по определенному идентификатору корзины при каждой вставке или удаляют соответственно и обновляют OrderCount в таблице Bucket для определенного идентификатора корзины.
Проблема в том, что во время тестовых прогонов, если я удаляю Order и сбрасываю сеанс, выдается исключение со следующим сообщением:
NHibernate.AdoNet.TooManyRowsActedException: неожиданное количество строк: 2; ожидается: 1
, что, вероятно, вызвано выполнением триггера сразу после удаления Order.
PS:
Триггер считает записи и обновления заказов. Запись корзины в Read Commited уровень изоляции.