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