【发布时间】:2010-11-15 12:32:36
【问题描述】:
我正在检查 Linq for NHibernate 2.1 以在 ASP.NET MVC 应用程序中使用,并且我正在尝试找出会话管理。作为第一个实验,我尝试从Pro ASP.NET MVC Framework 修改 SportsStore 应用程序。这个示例应用程序使用 Linq to Sql,所以我认为这将是一个很好的练习。我有 NHibernate 2.1 访问数据库,非 Linq 查询工作正常。
在 Linq to SQL 中,我们可以从数据上下文和连接字符串创建一个 IQueryable 对象,该对象可以传递和使用,而无需担心维护任何上下文。 例如,原始产品存储库代码如下所示:
public IQueryable<Product> Products
{
get { (new DataContext(_connectionString)).GetTable<Product>();
}
应用使用返回的 IQueryable 来填充产品列表、检索产品详细信息等。
在 NHibernate Linq 中类似地使用数据上下文,但不是连接字符串,而是提供一个会话对象,该对象在使用 IQueryable 时必须保持在范围内:
IQueryable<Product> products = new SportsStoreContext(session).Products;
所以我想知道我应该如何管理该会话而不会对示例应用程序的结构造成太大的破坏。理想情况下,我想要一个解决方案,使我能够通过仅进行本地更改来用 NHibernate Linq 替换 Linq to Sql 代码。
NHibernate 会话实现了 IDisposable,并且大多数 NHibernate 示例演示了使用 using{} 构造的会话管理,但这种策略在这里不起作用。 This thread 讨论了一些不同的方法,S#arp Architecture 和 HybridSessionBuilder。有人用这些来用 NHibernate Linq 替换 Linq to Sql 吗?还有其他更好的方法吗?
**编辑 mausch 说得对——解决这个问题的常用方法是使用 httpmodule。 NHibernate in Action 描述了两种方法:每个请求会话 (p334) 和会话每个会话 (p340)。后者允许您跨多个 http 请求重用持久实例。除了 mausch 提供的链接之外,NHibernate in Action 还提到了NHibernate Burrow、Castle ActiveRecord 和Rhino Tools。
【问题讨论】:
标签: asp.net-mvc linq nhibernate