1

我们正在使用 NHibernate 3.2。

我希望能够记录来自特定 ISession 的 SQL 查询。那可能吗?

或者,如果这不可能,我可以将记录器设置为特定的 ISessionFactory 吗?然后我可以从这个特定的工厂创建这个 ISession。

据我所见,要设置记录器,您必须执行以下操作:

<appSettings>
       <add key="nhibernate-logger" value="NH3SQLLogger.LoggerFactory, NH3SQLLogger" />
</appSettings>    

但是,这将使所有工厂的设置全局化。

我可以做这样的事情吗:

        var config = new Configuration();
        config.Configure();
        config.SetProperty("nhibernate-logger",
                       "NH3SQLLogger.LoggerFactory, NH3SQLLogger");
        _sessionFactory = config.BuildSessionFactory();

那行得通吗?还是有其他方法?

4

1 回答 1

4

不,您只能全局指定记录器。做你想做的事情会相当复杂。

您需要:

  1. 编写自己的 ILoggerFactory 实现
  2. 从 NHibernate.SQL 捕获日志数据以捕获所有 SQL
  3. 从 NHibernate.Impl.SessionImpl 捕获日志数据以捕获生成 SQL 的 ISession 和 ISessionFactory。
  4. 对逻辑进行编码以忽略除您命名的 ISessionFactory 生成的 SQL 之外的所有 SQL。

这里有一些代码可以帮助您入门:

public class LoggerFactory : ILoggerFactory
{
    #region Implementation of ILoggerFactory

    /// <summary>
    /// Returns the logger for a given key name
    /// </summary>
    /// <param name="keyName">Key or class name</param>
    /// <returns>Logger</returns>
    public IInternalLogger LoggerFor( string keyName )
    {
        if ( string.IsNullOrWhiteSpace( keyName ) )
            return new NoLoggingInternalLogger();

        switch ( keyName )
        {
            case "NHibernate.SQL":
                return new SqlLogger(); // Create this class to capture the SQL
            case "NHibernate.Impl.SessionImpl":
                return new SessionLogger(); // Create this class to capture ISession-related stuff
            default:
                return new NoLoggingInternalLogger();
        }
    }

    /// <summary>
    /// Returns the logger for a given type
    /// </summary>
    /// <param name="type">Class name</param>
    /// <returns>Logger</returns>
    public IInternalLogger LoggerFor( Type type )
    {
        return LoggerFor( type.FullName );
    }

    #endregion Implementation of ILoggerFactory
}
于 2013-03-29T00:37:10.997 回答