Я использую 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?