我遇到了一个以前从未遇到过的问题(我已经在.NET框架中使用NHibernate很多年了(
在我当前的项目中,我正在创建我的会话工厂Fluently.Configure((……BuildSessionFactory((,并将其添加到我的DI中,使用ConfigureServices方法(.net core 3.1(
该工厂稍后用于打开会话并执行sql。
在幸福的道路上,这是伟大的,没有问题,一切都很好。
问题是,如果sql实例出现问题,比如数据库离线,那么在执行BuildSessionFactory((时网站的启动将出错。这样就无法将会话工厂添加到DI,站点也无法加载。此外,由于网站初始化失败,它无法重定向到自定义错误页面。
此外,在.NET核心3中,将不会重试初始化。,因此,无论数据库现在是否可用,我都会得到相同的错误。
当我试图解决这个问题并进行调查时,我确实设法用一个临时的假工厂(默认实现(巧妙地替换了会话工厂(出现错误(,以避免应用程序的初始化。然后,如果找到了这个实例,就向下重定向到错误页面。但很明显,在应用程序池被回收并重新开始之前,我一直处于这种情况。
DB连接是在这个初始化点建立的吗?是否有办法将这一部分移到工厂创建之外,以便在随后的请求中重试?
https://github.com/nhibernate/nhibernate-core/discussions/2638
有人在nhibernate论坛上回答了我的问题。
解决方案是添加
.ExposeConfiguration(cfg =>
{
cfg.SetProperty("hbm2ddl.keywords", "none");
})
我还添加了
Dialect dialect = Dialect.GetDialect(cfg.GetDerivedProperties());
SchemaMetadataUpdater.QuoteTableAndColumns(cfg, dialect);
希望它能引用表和列,但我还没有测试