Есть ли способ узнать во время выполнения количество вызовов, которые NHibernate делает в базу данных?
Я знаю, что могу использовать профилировщик NHibernate (NHProf, http://nhprof.com/), чтобы вручную просмотреть этот счетчикво время отладки, но я хотел бы во время выполнения получить фактическое количество вызовов к базе данных, которые выполняет NHibernate, чтобы я мог выдать исключение, если это смешное число, например 50 или 300 (точное число должно быть определено).
Это будет указанием разработчику, что он / она должен использовать 'Eager' и 'Future' и настроить код NHibernate, чтобы сотни вызовов не выполнялись в базе данных.
Ниже у меня есть пример, где я вижу 284 вызова в базу данных -
Мы можем исправить этот код - поэтому я не ищу решение о том, как сделать этот код NHibernate лучше.вместо этого мы хотели бы реализовать систему, которая уведомляла бы разработчиков, что им нужно настроить код Nhibernate.
Пример - предположим, у нас есть следующая модель / db -
customer customeraddress order orderstateDetail
Приведенный ниже код выполняет один вызов select для каждой детали заказа для каждой из связанных таблиц и т. Д. Имея только 72 детали заказа в db, мы заканчиваемс 284 звонками в базу данных.
var query = QueryOver.Of<OrderDetail>()
.Where(c => c.UpdateTime >= updateTime);
using (var context = _coreSessionFactory.OpenSession())
{
var count = query.GetExecutableQueryOver(context)
.ToRowCountQuery()
.FutureValue<Int32>();
var items = query
.OrderBy(a => a.UpdateTime).Desc
.Skip(index ?? 0)
.Take(itemsPerPage ?? 20)
.GetExecutableQueryOver(context)
.Fetch(c => c.Order.OrderState).Eager
.Fetch(c => c.Order.Customer.CustomerAddress).Eager
.Future();
return new
{
Typename = "PagedCollectionOfContract",
Index = index ?? 0,
ItemsPerPage = itemsPerPage ?? 20,
TotalCount = count.Value,
Items = items.ToList().Select(c => new
{
Typename = "OrderDetail",
c.Id,
OrderId = c.Order.Id,
OrderStateAffiliates = c.Order.OrderStates.First(n => n.Name == StateNames.California).AffiliateCount,
CustomerZipCode = c.Order.Customer.CustomerAddresses.First(n => n.StateName == StateNames.California).ZipCode,
CustomerName = c.Order.Customer.Name,
c.DateTimeApproved,
c.Status
})
.ToArray()
};
}
Для этой модели заказа / клиента не важно понимать и улучшать ее - это всего лишь пример, поэтому мы получаем представление о том, почему мне нужно получить количество вызовов, которые NHibernate делает в БД.