【发布时间】:2011-02-21 11:55:03
【问题描述】:
尝试使用 ASP.NET MVC 和 NHibernate 从 DB 获取 185 条记录时,我收到了 System.OutOfMemoryException。 这是 Repository 类中方法的代码 sn-p:
public IList<RequestForm> GetForFullExport(RequestFormSearchCriteria searchCriteria, string[] restrictRoles)
{
...
DetachedCriteria criteria = DetachedCriteria.For<RequestForm>()
.CreateAlias("RequestMember", "RequestMember")
.CreateAlias("RequestFormStatu", "RequestFormStatu")
.SetFetchMode("RequestMember", FetchMode.Eager)
.SetFetchMode("RequestFormStatu", FetchMode.Eager);
DetachedCriteria criteriaLang = DetachedCriteria.For<RequestForm>("af")
.SetFetchMode("RequestFormsLanguages", FetchMode.Eager)
.SetFetchMode("RequestFormsLanguages.LanguageMember", FetchMode.Eager);
DetachedCriteria criteriaDoc = DetachedCriteria.For<RequestForm>("af")
.SetFetchMode("RequestFormsDocuments", FetchMode.Eager)
.SetFetchMode("RequestFormsDocuments.DocumentMember", FetchMode.Eager);
criteriaLang.Add(Subqueries.PropertyIn("Id", NHibernate.CriteriaTransformer.Clone(criteria).SetProjection(NHibernate.Criterion.Projections.Id())));
criteriaDoc.Add(Subqueries.PropertyIn("Id", NHibernate.CriteriaTransformer.Clone(criteria).SetProjection(NHibernate.Criterion.Projections.Id())));
//Add sort
if (!string.IsNullOrEmpty(searchCriteria.SIdx))
{
criteria.AddOrder(new Order(searchCriteria.SIdx, searchCriteria.SOrd == "asc"));
}
var multiResult = Session.CreateMultiCriteria()
.Add(criteria)
.Add(criteriaLang)
.Add(criteriaDoc)
.List();
...
}
这里是代码因 System.OutOfMemory 异常而中断的地方 - 在 Session.CreateMultiCriteria() 处。 我提取了 NHibernate 生成的 SQL 查询并直接在 SQL Server 2005 Management Studio 中执行它,我很快就得到了结果(185 行)。
应用程序实际上正在尝试将 jQuery 网格行导出到 CSV 文件,并且在此过程中调用了上述方法。 仅当我尝试导出所有行时才会发生崩溃。当我导出多行时 - 一切正常。
提前感谢您的帮助。
【问题讨论】:
-
对不起,我忘了放堆栈跟踪,但是,无论如何,我已经找到了问题所在。我会发布它作为答案。谢谢。
标签: c# asp.net-mvc database nhibernate orm