在使用Nhibernate ISaveOrUpdateEventListener时遇到一些麻烦

时间:2011-08-08 16:21:36

标签: vb.net nhibernate event-listener

我刚刚开始一个新项目,我正在尝试使用ISaveOrUpdateEventListener来设置我的实体上的datecreated和dateupdated字段。

我一直在尝试按照此处找到的解决方案的简化版本: http://fabiomaulo.blogspot.com/2011/05/nhibernate-bizarre-audit.html

这是我的听众:

Namespace Repositories


    Public Class UpdateAndInsertEventListener
        Implements ISaveOrUpdateEventListener

        Public Sub OnSaveOrUpdate([event] As NHibernate.Event.SaveOrUpdateEvent) Implements NHibernate.Event.ISaveOrUpdateEventListener.OnSaveOrUpdate
            Dim entity = TryCast([event].Entity, IDateCreatedAndUpdated)
            If entity IsNot Nothing Then
                Dim dateUpdated = DateTime.Now

                If entity.DateCreated Is Nothing Then
                    entity.DateCreated = dateUpdated
                End If

                entity.DateUpdated = dateUpdated
            End If
        End Sub


    End Class

End Namespace

这是我的hibernate.cfg.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
    <session-factory>
        <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
        <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
        <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
        <property name="connection.connection_string"></property>

        <property name="show_sql">true</property>
        <event type="save-update">
            <listener class="Project.Repositories.UpdateAndInsertEventListener, Project"/>
        </event>

    </session-factory>


</hibernate-configuration>

我的问题是,它从不在我的监听器中运行代码,因此它试图将null插入我的数据库中:(我尝试将断点放入,但它们永远不会被击中。

我想我在某个地方错过了一步,但我不知道在哪里。

这是失败测试的堆栈跟踪:

System.Data.SqlClient.SqlConnection.OnError(SqlException exception,Boolean breakConnection) System.Data.SqlClient.SqlInternalConnection.OnError(SqlException异常,Boolean breakConnection) System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj) System.Data.SqlClient.SqlDataReader.ConsumeMetaData() System.Data.SqlClient.SqlDataReader.get_MetaData() System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds,RunBehavior runBehavior,String resetOptionsString) System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,Boolean async) System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,String method,DbAsyncResult result) System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,String method) System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior,String method) System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader() NHibernate.AdoNet.AbstractBatcher.ExecuteReader(IDbCommand cmd) NHibernate.Id.IdentityGenerator.InsertSelectDelegate.ExecuteAndExtract(IDbCommand insert,ISessionImplementor session) NHibernate.Id.Insert.AbstractReturningDelegate.PerformInsert(SqlCommandInfo insertSQL,ISessionImplementor session,IBinder binder) NHibernate.Id.Insert.AbstractReturningDelegate.PerformInsert(SqlCommandInfo insertSQL,ISessionImplementor session,IBinder binder) NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object [] fields,Boolean [] notNull,SqlCommandInfo sql,Object obj,ISessionImplementor session) NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object [] fields,Object obj,ISessionImplementor session) NHibernate.Action.EntityIdentityInsertAction.Execute() NHibernate.Engine.ActionQueue.Execute(IExecutable可执行文件) NHibernate.Event.Default.AbstractSaveEventListener.PerformSaveOrReplicate(Object entity,EntityKey key,IEntityPersister persister,Boolean useIdentityColumn,Object anything,IEventSource source,Boolean requiresImmediateIdAccess) NHibernate.Event.Default.AbstractSaveEventListener.PerformSave(Object entity,Object id,IEntityPersister persister,Boolean useIdentityColumn,Object anything,IEventSource source,Boolean requiresImmediateIdAccess) NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId(Object entity,String entityName,Object anything,IEventSource source,Boolean requiresImmediateIdAccess) NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent事件) NHibernate.Event.Default.DefaultSaveEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent事件) NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsTransient(SaveOrUpdateEvent事件) NHibernate.Event.Default.DefaultSaveEventListener.PerformSaveOrUpdate(SaveOrUpdateEvent事件) NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(SaveOrUpdateEvent事件) NHibernate.Impl.SessionImpl.FireSave(SaveOrUpdateEvent事件) NHibernate.Impl.SessionImpl.Save(Object obj) C:\ Projects \ Project \ Project \ Repositories \ UserRepository.vb中的Project.Repositories.UserRepository.Add(用户用户):第10行 C:\ Projects \ Project \ Project.Tests \ Repositories \ UserRepository \ CRUDTest.vb中的Project.Tests.CRUDTest.CRUDTest():第50行

感谢您的帮助!

编辑:我已经改变了我的助手,在那里添加了监听器。它似乎正在为更新工作,但是当我创建新实体时,它似乎仍然没有进入监听器。我还从我的

中删除了“register”子
Imports NHibernate

Namespace Repositories


    Public Class NhibernateHelper

        Private Shared m_sessionFactory As ISessionFactory
        Private Shared ReadOnly Property SessionFactory As ISessionFactory
            Get
                If m_sessionFactory Is Nothing Then
                    Dim config As New NHibernate.Cfg.Configuration
                    config.Configure("C:/Projects/Project/Project.Tests/hibernate.cfg.xml")
                    config.AddAssembly(GetType(Entities.User).Assembly)

                    config.EventListeners.SaveEventListeners =    config.EventListeners.SaveEventListeners.Concat({New UpdateAndInsertEventListener}).ToArray
                    config.EventListeners.SaveOrUpdateEventListeners = config.EventListeners.SaveOrUpdateEventListeners.Concat({New UpdateAndInsertEventListener}).ToArray
                    config.EventListeners.UpdateEventListeners = config.EventListeners.UpdateEventListeners.Concat({New UpdateAndInsertEventListener}).ToArray

                    m_sessionFactory = config.BuildSessionFactory

                End If

                Return m_sessionFactory

            End Get
        End Property

        Public Shared Function OpenSession() As ISession
            Return SessionFactory.OpenSession()
        End Function

    End Class

End Namespace

1 个答案:

答案 0 :(得分:1)

您的注册码存在问题:

listeners.SaveEventListeners.Concat

这不会修改SaveEventListeners集合,而是返回一个新集合。您需要设置集合。