簡體   English   中英

Nhibernate ISaveOrUpdateEventListener遇到問題

[英]Having some trouble with Nhibernate ISaveOrUpdateEventListener

我剛剛開始一個新項目,並試圖暗示ISaveOrUpdateEventListener在我的實體上設置創建日期和更新日期字段。

我一直在嘗試遵循此處找到的解決方案的簡化版本: 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插入到我的db中:(我曾嘗試在其中插入斷點,但從未擊中它們。

我想我在某處缺少一步,但我不確定在哪里。

這是測試失敗的堆棧跟蹤:

System.Data.SqlClient.SqlConnection.OnError(SqlException異常,布爾值breakConnection)System.Data.SqlClient.SqlInternalConnection.OnError(SqlException異常,布爾值BreakConnection)System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()System.Data.SqlClient.TdsParser .Run(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj) SqlDataReader ds,RunBehavior runBehavior,字符串resetOptionsString)System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,Boolean異步)字符串方法,DbAsyncResult結果)System.Data.SqlClient.SqlComma nd.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,String方法)System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior行為,String方法)System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior行為)System.Data.Common NHibernate.AdoNet.AbstractBatcher.ExecuteReader(IDbCommand cmd)NHibernate.Id.IdentityGenerator.InsertSelectDelegate.ExecuteAndExtract(IDbCommand插入,ISessionImplementor會話) insertSQL,ISessionImplementor會話,IBinder綁定器)NHibernate.Id.Insert.AbstractReturningDelegate.PerformInsert(SqlCommandInfo insertSQL,ISessionImplementor會話,IBinder綁定器)NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object []字段,Boolean [] notNull,SqlCommand對象obj,ISessionImplementor會話)NHibernate.Persister.Entity.AbstractEntityPersister .Insert(Object []字段,Object obj,ISessionImplementor會話)NHibernate.Action.EntityIdentityInsertAction.Execute()NHibernate.Engine.ActionQueue.Execute(IExecutable可執行文件)NHibernate.Event.Default.AbstractSaveEventListener.PerformSaveOrReplicate(對象實體,EntityKey鍵, IEntityPersister持久性,布爾useIdentityColumn,任何對象,IEventSource源,布爾RequiresImmediateIdAccess)NHibernate.Event.Default.AbstractSaveEventListener.PerformSave(對象實體,對象ID,IEntityPersister持久性,布爾useIdentityColumn,對象任何對象,IEventSource源,布爾RequireImmediateIdAccess)NHibernate。默認對象 edId(SaveOrUpdateEvent事件)NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsTransient(SaveOrUpdateEvent事件)NHibernate.Event.Default.DefaultSaveEventListener.PerformSaveOrUpdate(SaveOrUpdateEvent事件)NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(SaveOrUpdateEvent事件)NHibernate.Event FireSave(SaveOrUpdateEvent事件)NHibernate.Impl.SessionImpl.Save(Object obj)C:\\ Projects \\ Project \\ Project \\ Repositories \\ UserRepository.vb中的Project.Repositories.UserRepository.Add(用戶):第10行Project.Tests.CRUDTest C:\\ Projects \\ Project \\ Project.Tests \\ Repositories \\ UserRepository \\ CRUDTest.vb中的.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

您的注冊碼有問題:

listeners.SaveEventListeners.Concat

這不會修改SaveEventListeners集合,而是返回一個新的集合。 您需要設置集合。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM