【问题标题】:Nhibernate cache problem while using SQL Server triggers使用 SQL Server 触发器时出现休眠缓存问题
【发布时间】: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


    【解决方案1】:

    在触发器中使用SET NOCOUNT ON 以抑制触发器处理中的(xx rows affected)“虚拟”结果集。

    示例 SO 问题:TooManyRowsAffectedException with encrypted triggers

    【讨论】:

    • 我已经在所有触发器中使用了 SET NOCOUNT ON ,但它没有起到作用。不过还是谢谢!
    • 尝试在触发器中添加SET ROWCOUNT 0
    • @AnastasiyaMartynyak SET ROWCOUNT 已弃用
    猜你喜欢
    • 2011-11-18
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多