我刚刚开始一个新项目,我正在尝试使用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
答案 0 :(得分:1)
您的注册码存在问题:
listeners.SaveEventListeners.Concat
这不会修改SaveEventListeners集合,而是返回一个新集合。您需要设置集合。