Проблема с кешем Nhibernate при использовании триггеров SQL Server - PullRequest
1 голос
/ 13 июля 2010

Я использую Nhibernate с Fluent, чтобы сохранить базу данных SQL Server 2008 Express в бизнес-приложении.

У меня есть класс с именем Receipt, который содержит список со многими объектами с именем ReceiptItems. Пользователь может создать квитанцию, добавить квитанции к ней и редактировать ее, пока она не помечена как Законченная. Эта часть работает хорошо и правильно сохраняет в БД. Теперь о проблеме:

У меня также есть триггер на квитанции таблицы SQL, который срабатывает, если вставлено. Закончено true. Триггер выбирает новые цены из «таблицы поставщиков» и обновляет цены для всех ReceiptItems, в таблице ReceiptItems.

при звонке Session.saveOrUpdate (значение) а потом transaction.Commit ()

последнее вызывает исключение: StaleObjectStateException Строка была обновлена ​​или удалена другой транзакцией (или сопоставление несохраненного значения было неверным) в ReceiptItems

Устранение проблемы, конечно, устраняет проблему, но мне нужно обновить цены. Есть ли способ для nhibernate игнорировать ошибка и обновить кэш после срабатывания триггера?

Простые определения примеров классов с отображениями Fluent:

 public class Receipt
    {

        public Receipt() { }
        /// <summary>Identificator/// </summary>
        public virtual int Id { get; private set; }
        /// <summary> if finished true, cant edit data/// </summary>
        public virtual Boolean Finished { get; set; }
        /// <summary>Items of this Receipt/// </summary>
        public virtual IList<ReceiptItems> Items{ get; set; }
    }

    /// <summary>Mapping for NHibernate Fluent/// </summary>
    public class ProdajaMap : ClassMap<Prodaja>
    {

        public ReceiptMap()
        {
            Table("Receipt");
            OptimisticLock.All();
            DynamicUpdate();
            Id(x => x.Id);
            Map(x => x.Finished);
            HasMany<ReceiptItems>(x => x.Items).AsBag().KeyColumn("Receipt_ID");
        }
    }

public class ReceiptItem
    {

        public ReceiptItem() { }

        public virtual int Id { get; private set; }
        /// <summary>Id of the Receipt/// </summary>
        public virtual int Receipt_ID{ get; set; }

        /// <summary>Supplier price/// </summary>
        public virtual decimal Price{ get; set; }
        /// <summary>Supplier discount/// </summary>
        public virtual decimal Discount { get; set; }
    }

    /// <summary>Mapping for NHibernate Fluent/// </summary>
    public class ReceiptItemMap : ClassMap<ReceiptItem>
    {
        public ReceiptItemMap()
        {
            Table("ReceiptItems");
            OptimisticLock.All();
            DynamicUpdate();
            Id(x => x.Id);
            Map(x => x.Receipt_ID).Column("Receipt_ID");
            Map(x => x.Price);
            Map(x => x.Discount );

        }
    }

Большое спасибо!

UPDATE:

Я нашел свойство nhibernate, которое делает именно то, что мне нужно, так как триггеры должны генерировать значения Price и Discount:

5,6. Сгенерированные свойства Сгенерированные свойства являются свойствами, которые имеют их значения генерируются база данных. Как правило, Hibernate приложения, необходимые для обновления объектов которые содержат любые свойства, для которых база данных генерировала значения. Маркировка свойств как созданных, тем не менее, позволяет приложению делегировать это ответственность перед Hibernate. По сути, всякий раз, когда проблемы Hibernate SQL INSERT или UPDATE для сущности который определил сгенерированный свойства, он немедленно выдает выберите впоследствии, чтобы получить сгенерированные значения.

Свойства, помеченные как сгенерированные, должны дополнительно быть не вставляемым и не-обновляемый.

Поскольку я новичок в этом ..., означает ли последняя отправка, что я не могу вставить или обновить значения с помощью nhibernate?

1 Ответ

1 голос
/ 13 июля 2010

Используйте SET NOCOUNT ON в триггере для подавления (xx rows affected) "фиктивных" наборов результатов из обработки триггера.

Пример SO вопрос: TooManyRowsActedException с зашифрованными триггерами

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