Возникли проблемы с Nhibernate ISaveOrUpdateEventListener - PullRequest
0 голосов
/ 08 августа 2011

Я только начинаю новый проект и пытаюсь внедрить 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>

моя проблема в том, что он никогда не запускает код в моем слушателе, поэтому он пытается вставить ноль в мою базу данных :( Я пытался вставить точки останова, но они никогда не ударились.

Я думаю, что где-то пропущен шаг, но я не уверен, где.

Вот трассировка стека из неудачного теста:

System.Data.SqlClient.SqlConnection.OnError (исключение SqlException, логическое breakConnection) System.Data.SqlClient.SqlInternalConnection.OnError (исключение SqlException, логическое breakConnection) System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning (), SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) System.Data.SqlClient.SqlDataReader.ConsumeMetaData () System.Data.SqlClient.SqlDataReader.get_MetaData () System.Data.SqlClient.SqlCommand.FinishExecuteReader (SqlDataReader Д.С., RunBehavior runBehavior, String resetOptionsString) System.Data.SqlClient.SqlCommand.RunExecuteReaderTds (CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean асинхронной)System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, логический returnStream, метод Stb, DbAsyncResult результат, метод DbAsyncResult) System.Data.SqlClient..SqlClient.SqlCommand.ExecuteReader (поведение CommandBehavior, метод String) System.Data.SqlClient.SqlCommand.ExecuteDbDataReader (поведение CommandBehavior) System.Data.Common.DbCommand.System.Data.IDbCommand.Ex.AbReaderExaderReader(IDbCommand cmd) NHibernate.Id.IdentityGenerator.InsertSelectDelegate.ExecuteAndExtract (IDbCommand insert, Сессия ISessionImplementor) NHibernate.Id.Insert.AbstractReturningDelegate.PerformInsert (SqlCommandInfo insertSQL, сессия ISessionImplementor, связыватель IBinder)Вставить (поля Object [], Boolean [] notNull, SqlCommandInfo sql, Object obj, сеанс ISessionImplementor) NHibernate.Persister.Entity.AbstractEntityPersister.Insert (Object [] поля, Object obj, сеанс ISessionImplementor) NHibernate.Action.EntityIdentity) NHibernate.Engine.ActionQueue.Execute (исполняемый файл IExecutable) NHibernate.Event.Default.AbstractSaveEventListener.PerformSaveOrReplicate (объектная сущность, ключ EntityKey, IEntityPersister persister, логический useIdentityColumn.EbjectEventEbjectEccessEateMateBateEventEventEvent) источник любой.PerformSave (Объектный объект, Объектt id, IEntityPersister persister, логическое значение useIdentityColumn, Object что угодно, источник IEventSource, логическое значение requireImmediateIdAccess) NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId (объектный объект, строковый объектName, обязательный объект.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.Sec.Проекты \ Проект \ Проект \ Репозитории \ UserRepository.vb: строка 10 Project.Tests.CRUDTest.CRUDTest () в C: \ Проекты \ Проект \ Project.Tests \ Репозитории \ UserRepository \ CRUDTest.vb: строка 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 Ответ

1 голос
/ 08 августа 2011

Проблема с вашим регистрационным кодом:

listeners.SaveEventListeners.Concat

Это не изменяет коллекцию SaveEventListeners, а вместо этого возвращает новую коллекцию. Вам нужно установить коллекцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...