Функциональность удаления объекта Nhibernate в сочетании с триггером базы данных, генерирующим исключение StaleStateException - PullRequest
0 голосов
/ 17 ноября 2009

Дизайн, который я опишу, каким-то образом нарушает дизайн хороших практик, но все же меня интересует, почему возникает эта проблема и как ее можно обойти. Я нашел описание проблем, которые могут возникнуть при использовании триггеров 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 уровень изоляции.

1 Ответ

2 голосов
/ 17 ноября 2009

Если вы используете SQL Server, SET NOCOUNT ON в триггере добьется цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...