0

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を使用して「単一の」データベーストランザクション/呼び出しでこれを行うにはどうすればよいですか?

4

1 に答える 1

0

これを達成するには複数のオプションがありますが、

  1. NHibernate を使用CreateSQLQueryして、データベースにリテラル SQL を渡すことができます。この方法では、ストアド プロシージャを実行でき、個々のステートメントについて心配する必要はありません。

    session.CreateSQLQuery(@"EXECUTE PROCEDURE <procedure>").ExecuteUpdate();
    
  2. ただし、新しい値で新しい行をSequence挿入する前に、フィールド ( ) をインクリメントしようとしているようです。これに対するトリガーを作成し、 NHibernateを完全にバイパスします。CustomerSequence

  3. 別のオプションは、この回答で説明されているように、NHibernate マッピングを使用してAUTO-INCREMENTフィールドを指定することです。

  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
        }
    }
    
于 2013-01-18T14:55:51.537 に答える