NHibernate:构建会话工厂是否需要连接到数据库?

NHibernate:构建会话工厂是否需要连接到数据库?,nhibernate,database-connection,sessionfactory,Nhibernate,Database Connection,Sessionfactory,将数据库迁移到新服务器后,我的工作副本无法再连接到数据库。但我正在经历一些出乎意料的事情。每当应用程序中的页面尝试连接到此数据库时,在构建会话工厂期间,即在ISession尝试显式连接(例如加载实体)之前,都会发生错误 是这样吗?为什么构建会话工厂需要连接到数据库?构建会话工厂时,它会缓存大量的查询、关系、元数据等。如果要求,它还可以创建/更新数据库。这就是我通过阅读一些课堂代码得到的 请记住,创建会话工厂的过程非常繁重,每个数据源只能执行一次。如果你仔细想想,它缓存和引导所有可能的东西是有道理

将数据库迁移到新服务器后,我的工作副本无法再连接到数据库。但我正在经历一些出乎意料的事情。每当应用程序中的页面尝试连接到此数据库时,在构建会话工厂期间,即在ISession尝试显式连接(例如加载实体)之前,都会发生错误


是这样吗?为什么构建会话工厂需要连接到数据库?

构建会话工厂时,它会缓存大量的查询、关系、元数据等。如果要求,它还可以创建/更新数据库。这就是我通过阅读一些课堂代码得到的

请记住,创建会话工厂的过程非常繁重,每个数据源只能执行一次。如果你仔细想想,它缓存和引导所有可能的东西是有道理的


如果您真的想知道它发生的原因和作用,我建议您下载源代码并进行调试。

构建会话工厂不一定要连接到数据库。我编写了一个应用程序,它实例化了会话工厂,以便在根本没有数据库的情况下从映射文件创建sql文件

但您可以建议会话工厂使用如下配置创建数据库:

<property name="hbm2ddl.auto">create</property>
创建
我不会在生产环境中这样做,但它可能对单元测试有用。检查您的项目是否有这样的配置


如果没有这样的配置,请检查错误消息(如果有任何有用的信息),并查看堆栈跟踪以查看其发生的位置。

在构建会话工厂时,还有另一个属性可能导致数据库连接尝试

<property name="hbm2ddl.keywords">keywords</property>

可以找到有关此功能的更多信息

谢谢-我知道构建会话工厂应该在应用程序的生命周期中只发生一次。我正在开发中,所以我通过VS web服务器运行应用程序,这就是为什么会频繁构建会话工厂。我没有通过会话工厂创建数据库,所以我仍然不明白为什么NH似乎在构建会话工厂时试图连接到数据库。
Exception Info: System.Net.Sockets.SocketException
    at ..............
    at System.Net.Sockets.NetworkStream.Read(Byte[], Int32, Int32)
    at MySql.Data.MySqlClient.MySqlConnection.Open()
    at NHibernate.Connection.DriverConnectionProvider.GetConnection()
    at NHibernate.Tool.hbm2ddl.SuppliedConnectionProviderConnectionHelper.Prepare()
    at NHibernate.Tool.hbm2ddl.SchemaMetadataUpdater.GetReservedWords(NHibernate.Dialect.Dialect, NHibernate.Tool.hbm2ddl.IConnectionHelper)
    at NHibernate.Tool.hbm2ddl.SchemaMetadataUpdater.Update(NHibernate.Engine.ISessionFactoryImplementor)
    at NHibernate.Impl.SessionFactoryImpl..ctor(NHibernate.Cfg.Configuration, NHibernate.Engine.IMapping, NHibernate.Cfg.Settings, NHibernate.Event.EventListeners)
    at NHibernate.Cfg.Configuration.BuildSessionFactory()