有没有办法在运行时获取 NHibernate 对数据库的调用次数?
我知道我可以使用 NHibernate 分析器(NHProf,http ://nhprof.com/ )在调试时手动查看此计数 - 但我想做的是在运行时获取对数据库 NHibernate 的实际调用次数正在制作,所以如果它是一个荒谬的数字,如 50 或 300(具体数字待定),我可以抛出异常。
这将向开发人员表明他/她需要使用“Eager”和“Future”并调整 NHibernate 代码,以便不会对数据库进行数百次调用。
下面我有一个示例,我看到对数据库进行了 284 次调用 -
我们可以修复这个代码——所以我不是在寻找如何让这个 NHibernate 代码更好的解决方案。相反,我想实现一个系统,通知开发人员他们需要调整 Nhibernate 代码。
示例 - 假设我们有以下模型/数据库 -
客户客户地址订单订单状态订单详情
下面的代码对每个相关表的每个订单详细信息进行一次选择调用,等等...数据库中只有 72 个订单详细信息,我们最终对数据库进行了 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 对数据库的调用次数。