【发布时间】:2010-07-12 22:31:16
【问题描述】:
我正在使用 Nhibernate 和 Fluent,将 SQL Server 2008 express 数据库持久保存在业务应用程序中。
我有一个名为 Receipt 的类,其中包含一个包含许多名为 ReceiptItems 的对象的列表。 用户可以创建收据,向其中添加 Receiptitems,并对其进行编辑,只要其未标记为 Finished。 这部分运行良好并正确保存到数据库。 现在解决问题:
我在 sql 表 Receipt 上也有一个触发器,如果 insert.Finished 为真则触发。 触发器从“供应商表”中获取新价格,并更新所有 ReceiptItems 的价格, 在 ReceiptItems 表中。
打电话时 session.SaveorUpdate(值) 进而 transaction.Commit()
后者导致异常: 陈旧对象状态异常 ReceiptItems 中的行被另一个事务更新或删除(或未保存的值映射不正确)
删除触发器当然可以解决问题,但我需要它来更新价格。有什么办法可以让 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 );
}
}
非常感谢!
更新:
我找到了一个 nhibernate 属性,它完全符合我的需要,因为 Price 和 Discount 值必须由触发器生成:
5.6。生成的属性 生成的属性是具有 它们的值由 数据库。通常,休眠 刷新对象所需的应用程序 其中包含任何属性 数据库正在生成值。 将属性标记为已生成, 但是,让应用程序委托 这个责任交给Hibernate。 本质上,每当 Hibernate 出现问题时 实体的 SQL INSERT 或 UPDATE 已定义生成 属性,它立即发出一个 选择之后检索 生成的值。
标记为已生成的属性必须 另外是不可插入的,并且 不可更新。
作为我的新手..,最后一句是否意味着我无法使用 nhibernate 插入或更新值?
【问题讨论】:
标签: c# sql-server nhibernate fluent-nhibernate triggers