1

変更されたプロパティごとに 1 つの行を変更ログ テーブルに格納する単純な NHibernate ベースの監査メカニズムをテストしようとしています。実際に行うことは、期待どおりに実際の挿入ステートメントを実行し、監査ログを 2 回実行することです。

だから、これは私がすることです:

string connectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=audittest;Integrated Security=SSPI;";
FluentConfiguration config = Fluently.Configure().Database(MsSqlConfiguration.MsSql2008
                                                        .ConnectionString(c => c.Is(connectionString)).ShowSql())
                                                        .Mappings(x => x.FluentMappings.Add<Class1ClassMap>())
                                                        .Mappings(x => x.FluentMappings.Add<ChangeLogMap>())
                                                        .ExposeConfiguration(cfg =>
                                                        {
                                                            NHibernateAuditListener listener = new NHibernateAuditListener();
                                                            cfg.AppendListeners(ListenerType.PostInsert, new[] { listener });
                                                        });
ISessionFactory sf =  config.BuildSessionFactory();
ISession session = sf.OpenSession();
using (ITransaction tr = session.BeginTransaction())
{
    session.Save(new Class1()
        {
            FirstName="Peter",
            LastName="Pan",
            Id=100

        });
    tr.Commit();
}

編集:

失敗を確認するために、ロギング コードを単純なものに変更しました。

public void OnPostInsert(PostInsertEvent @event)
{
    if (@event.Entity is IAuditable)
    {                
        Console.WriteLine("----write audit----");
        for (int index = 0; index < @event.State.Length; index++)
            Console.WriteLine("----store changes of property {0}----",
                              @event.Persister.PropertyNames[index]);
    }
}

これにより、次の出力が生成されます。

NHibernate: INSERT INTO "Class1" (FirstName, LastName, Id) VALUES (@p0, @p1, @p2); @p0 = 'Peter' [Type: String (0)], @p1 = 'Pan' [Type: String (0)], @p2 = 1 [Type: Int64 (0)]
----write audit----
----store changes of property FirstName----
----store changes of property LastName----
----write audit----
----store changes of property FirstName----
----store changes of property LastName----

ご覧のように、間違っているのは EventHandler コードではなく、それを呼び出すフレームワークが予期しない動作をする (OnPostInsert メソッドを 2 回呼び出す)。なぜこれが起こっているのですか?

サンプルプロジェクトのダウンロード

4

1 に答える 1