我正在寻找一个简单的NHibernate示例,它将向我展示如何在整个表上进行迭代。这是我到目前为止所做的,但它不起作用。我得到一个“System.InvalidOperationException:由于对象的当前状态,操作无效。”我做错了什么?
public IEnumerable<EMPDATA> getEMPData()
{
using (ISession session = NHibernateHelper.OpenSession())
{
IEnumerable<EMPDATA> empData = session.CreateQuery("from EMPDATA").Enumerable<EMPDATA>();
return empData;
}
}
public static void Main(System.String[] args)
{
log.Debug("Entered main");
Console.WriteLine("Entered main");
try
{
IEMPDataRepository repository = new EMPDataRepository();
IEnumerable<EMPDATA> iterList = repository.getEMPData();
while( iterList.GetEnumerator().MoveNext())
{
EMPDATA emp = iterList.GetEnumerator().Current;
log.Debug(emp.EMP_ID);
}
}
catch (System.Exception ex)
{
log.Error("Exception occured reading emp data", ex);
}
这是我的映射:
答案 0 :(得分:1)
您请求一个可枚举的结果,这可能依赖于仍处于打开状态的会话。
因为您在返回Enumerable实例后处理会话,所以您已关闭与数据库的连接。
编辑:见NotSupportedException on IQuery's Enumerable when using statelesssession
答案 1 :(得分:0)
简短回答:使用.List
代替.Enumerable
。
答案 2 :(得分:0)
更长的回答:
我同意菲尔的看法 - 看起来像是SP的工作
2.迭戈(显然)是正确的,但如果我是你,我会使用SetFirstResult()和SetMaxResult()来控制你在每次迭代中加载到内存中的数据量(不要忘记按什么时候排序)当然,使用这种方法)。