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