如何在NHibernate WinForms应用程序中提供提示列表 背景

如何在NHibernate WinForms应用程序中提供提示列表 背景,winforms,nhibernate,Winforms,Nhibernate,使用NHibernate的WinForms应用程序。应用程序为MDI样式,每个MDI子窗体在加载时打开一个新的NHibernate会话,该会话在窗体的生命周期内保持打开状态 问题: 我的应用程序基本上是一个“订单管理”或“采购”系统。一个特定的表单使用很多“查找”列表。例如产品列表、供应商列表、地点列表、计量单位列表、价格报价列表等 很多列表,当表单构建时都会被加载 问题:我需要查找列表,但我需要更快地加载表单。表单花费的时间太长,无法执行所有查找。如何获得更好的性能并保留查找列表 我的想法

使用NHibernate的WinForms应用程序。应用程序为MDI样式,每个MDI子窗体在加载时打开一个新的NHibernate会话,该会话在窗体的生命周期内保持打开状态

问题: 我的应用程序基本上是一个“订单管理”或“采购”系统。一个特定的表单使用很多“查找”列表。例如产品列表、供应商列表、地点列表、计量单位列表、价格报价列表等

很多列表,当表单构建时都会被加载

问题:我需要查找列表,但我需要更快地加载表单。表单花费的时间太长,无法执行所有查找。如何获得更好的性能并保留查找列表

我的想法
  • 我是否可以加载一次查找列表,并在应用程序的生命周期中保留它们,并定期检查列表是否过时

  • 我可以只加载列表的文本描述,而不是保存一堆IList、IList等,我可以保存一堆IList,然后在保存时,对NHibernate执行Gets以获取真正的对象

  • 有没有其他我没有想到的方法


您是否将完整对象列表发送到您的UI?我最近开发了一个应用程序,在数据层和UI之间使用DTO,所以我不发送完整的对象,只发送一个描述和标识符。这可以帮助您删除一些不需要的数据。因此,基本上,当屏幕加载服务调用时,nhibernate获取我想要的列表框的所有对象,然后UI绑定到列表。我将我的listbox显示成员绑定到描述,将值成员绑定到标识符。

您肯定应该缓存缓慢变化的数据以提高性能。您需要检查过时数据的频率取决于数据的类型和您的业务,例如,度量单位的变化可能不如产品列表那样频繁。您还应该提供一种手动刷新列表的方法,以便用户可以在缺少某些内容时刷新列表


如果需要列表中的业务对象来执行数据库操作,可以调用ISession.Lock(obj)将对象锁定到当前ISession中。需要注意的一点是,锁不会自动级联到子对象:我认为有一个映射设置可以做到这一点,或者您可以手动执行。

是的,我知道我需要做一些事情才能将业务对象放入当前会话,我需要阅读lock()。我认为这种方法对我来说更容易,因为我有完整的对象来处理。持有ID和描述似乎也会起作用,但在节省时间时,似乎更需要转换这些ID。我确实考虑过这一点,但我不想采取额外的复杂性来保存。我将尝试在内存中缓存对象,因为它将为我提供完整的对象。如果失败了,那么我的下一个方法是使用ID+Descr方法,并在保存时转换为完整对象。