У меня проблема с тем, что запрос критерия в NHibernate выполняется менее чем за секунду, когда я запускаю его в модульном тесте, но когда я пытаюсь запустить его из контекста моего веб-приложения, это занимает более минуты , Оба используют одну и ту же базу данных для одних и тех же данных.
Мое сопоставление NHibernate:
var properties = new Dictionary<string, string>();
var configuration = new Configuration();
properties.Add("connection.provider", "NHibernate.Connection.DriverConnectionProvider");
properties.Add("proxyfactory.factory_class", "NHibernate.Bytecode.DefaultProxyFactoryFactory, NHibernate");
properties.Add("connection.release_mode", "on_close");
properties.Add("current_session_context_class", "web");
properties.Add("dialect", "NHibernate.Dialect.MsSql2005Dialect");
properties.Add("connection.connection_string_name", "DBConnection");
configuration.Properties = properties;
SessionFactory = configuration.BuildSessionFactory();
Единственное различие в этом отображении между тестами и веб-приложением - это current_session_context_class, где в тестах он является thread_static, но, похоже, это не проблема.
Критерии для запроса:
var reports = Session.CreateCriteria<Report>()
.SetFetchMode("Site", FetchMode.Join)
.SetFetchMode("Actions", FetchMode.Join)
.SetResultTransformer(new DistinctRootEntityResultTransformer())
.Add(Subqueries.PropertyIn("Site",
SiteCriteria.GetSitesForUserWithPermission(user, Permission.SomePermission))))
.List<Report>();
Я пытался использовать NH Profiler, чтобы помочь, но он не предлагал никаких полезных советов.
edit: заглядывая в nhprofiler, я вижу, что в тесте, например, длительность запроса составляет 1 мс / 313 мс (только для базы данных / всего).
Но для веб-сайта это заняло у меня 1 мс / 43698 мс. Кажется, что NHibernate испытывает трудности с отображением реальных объектов.