我使用Nhibernate和Fluent来在业务应用程序中保留SQL Server 2008 Express数据库。使用SQL Server触发器时Nhibernate缓存问题
我有一个名为Receipt的类,它包含一个包含许多名为ReceiptItems的对象的列表。 用户可以创建收据,将收据添加到收据,并编辑它,只要其未标记为已完成即可。 这部分工作正常,并正确保存到数据库。 现在的问题:
我也有一个触发器的sql表Receipt,如果inserted.Finished是真的会触发。 触发器从“供应商表”中提取新价格,并更新ReceiptItems表中所有ReceiptItems的价格,即 。
致电时 session.SaveorUpdate(值) 然后 器transaction.commit()
后者导致异常: StaleObjectStateException 行被另一事务更新或删除(或者未保存值的映射是不正确)在收货项
删除课程触发器修复了问题,但我需要它来更新价格。有没有办法让nhibernate忽略 错误,并在触发器触发后刷新其缓存?
简单的类定义,例如用流利的映射:
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的财产,这不正是我需要的,至于价格和折扣值必须由触发产生:
5.6。生成的属性生成的属性是由 数据库生成的值为 的属性。通常情况下,休眠 刷新对象所需的应用程序 其中包含数据库正在生成值的任何属性。 标记属性生成, 但是,让应用程序委托 这个责任到Hibernate。 本质上,每当Hibernate发出 SQL INSERT或UPDATE实体 已定义生成 属性,它立即发出 选择后来检索 生成的值。
标记为生成的属性必须另外为不可插入 且不可更新 。
由于即时通讯新在这.. ..是否最后一个礼让意味着,我不能插入或更新值与nhibernate?
我已经在所有触发器使用SET NOCOUNT ON,并没有这样的伎俩。不过谢谢! – wabbawabbe 2010-07-13 09:17:08