我对FNH和NH世界还很陌生,所以请保持温柔:P
我创建了一个使用FNH进行数据访问的应用程序,该应用程序在不使用延迟加载的情况下运行良好,但是一旦启用了延迟加载,一切都会变得像梨形(例如,当我尝试访问延迟加载的属性时,没有打开任何会话等) )。
到目前为止,我创建的应用程序布局具有“数据库”单例,该单例具有各种方法,例如Save(),Refer()和List()。
当调用Refer()时,打开一个会话,检索数据并处理该会话;表示在尝试从返回的对象访问延迟加载的属性时没有可用的会话。示例:Database.Refer(“ username”)。Person,因为Person是延迟加载的,并且会话已经关闭。
我已经读过Castle有一个SessionManager可以用于这种情况,但是,无论是在深夜还是喝咖啡的时候,我似乎都无法弄清楚如何连接FNH来使用此管理器城堡,一切都在配置文件中定义。
我是否缺少某些东西,还是无法完成?我还应该查看其他任何会话管理器(或更合适的约定)吗?
感谢您对此事的任何帮助。
最佳答案
我不认为您的特定问题与SessionManager
有关,因为您已经提到过,您能够启动新的会话并在需要时进行处置。
从我对您的帖子的了解中可以看出,您正在尝试向您的视图公开一个实体(具有一些延迟加载的属性)-这已经不是一个好主意,因为它会导致令人讨厌的LazyInitializationException(s)
。
您应该考虑区分您的data-model
和domain model
。该博客已描述了关键概念:
Ayende @ Rahien
http://ayende.com/blog/4054/nhibernate-query-only-properties
如果您说您正在编写一个非常简单的2层应用程序,那么如果您将在数据层中对会话进行微管理,那么它可能不会受到损害(但请记住,这不是最佳解决方案)。
我还将研究获取您的实体的查询,因为在我看来,您正在尝试获取只是模型一部分的数据-在本例中为Person
。这可能导致严重的问题,例如n+1 selects
:
What is SELECT N+1?
因此,总的来说,我认为您应该更多地关注应用程序中事物的结构,而不是搜索SessionManager
,因为它不能解决所有问题。
关于c# - 流利的NHibernate ISession Manager或同等水平,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6560228/