2010-07-12 44 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?

回答