2010-07-12 49 views
1

我使用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?

回答