【问题标题】:Dependency UPDATE/INSERT in NHibernateNHibernate 中的依赖更新/插入
【发布时间】:2013-01-02 06:44:04
【问题描述】:

我正在尝试使用 NHibernate 实现以下 TSQL 代码(当前包含在存储过程中)。如您所见,系统已经实现了一些自定义排序。

DECLARE @NextSequence bigint;

UPDATE [dbo].[Sequencer] SET @NextSequence = Sequence = Sequence + 1;

INSERT INTO [dbo].[Customers] (Id,Name) VALUES (@NextSequence, 'Jack');

INSERT 语句取决于UPDATE,而设置@NextSequence 变量的方式很重要。

如何在使用 NHibernate 的“单一”数据库事务/调用中做到这一点?

【问题讨论】:

    标签: nhibernate


    【解决方案1】:

    您有多种选择来实现这一目标,

    1. 您可以使用 NHibernate 的 CreateSQLQuery 将文字 SQL 传递给数据库,这样您就可以执行存储过程而不必担心单个语句。

      session.CreateSQLQuery(@"EXECUTE PROCEDURE <procedure>").ExecuteUpdate();
      
    2. 但是,您似乎试图在插入具有新 Sequence 值的新 Customer 行之前增加字段 (Sequence)。你create a trigger这个给你,完全绕过NHibernate。

    3. 另一种选择是使用 NHibernate 映射来指定 AUTO-INCREMENT 字段,如 this answer 中所述。

    4. 最后,您可以实现 NHibernate Interceptor 来更新 OnSave 事件的值,

      public class IncrementInterceptor : EmptyInterceptor
      {
          bool OnSave(object entity, object id, object[] state, 
              string[] propertyNames, IType[] types)
          {
              // Increment Customer property value before inserting
          }
      }
      

    【讨论】:

    • 谢谢,当然我们总是可以运行 raw/sql 查询,但关键是要摆脱存储过程并尽可能以 NHibernate 方式做事:(
    • 再次感谢您。问题是尽管在我的情况下数据库模式更改不是一个选项,因此我必须使用序列表来生成序列号,我也不能使用身份类型列进行自动增量(因为这将是数据库的变化)。
    • 我正在使用 MS SQL Server(更具体地说是尚不支持序列的 SQL Azure)。据我所知,我们在 SQL Server 中用于自动递增 int 类型字段的唯一选项是使用 IDENTITY 列,或者我在这里遗漏了什么?谢谢
    • 我做到了。 MySQL 中使用 AUTO_INCREMENT 类型,相当于 SQL Server 中的 Identity 列。 NHibernate 代码 sn-p 自动增加 SQL Server 表中不是序列或标识的列,这将非常有帮助,谢谢
    • 用第四个选项更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 2016-06-12
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    • 2018-11-07
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多