2009-07-30 121 views
4

我在退出Linq for NHibernate 2.1在ASP.NET MVC应用程序中使用,我试图找出会话管理。作为第一个实验,我试图从Pro ASP.NET MVC Framework修改SportsStore应用程序。这个示例应用程序使用Linq到Sql,所以我认为这将是一个很好的练习。我有NHibernate 2.1访问数据库和非Linq查询工作正常。NHibernate 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到Sql代码,只做本地更改。

NHibernate会话实现IDisposable,大多数NHibernate示例演示使用{}构造的会话管理,但此策略在此处不起作用。 This thread讨论了一些不同的方法,S#arp ArchitectureHybridSessionBuilder。有没有人用这些来用NHibernate Linq替换Linq到Sql?还有其他方法可以更好地工作吗?

**编辑 mausch有它的权利 - 通常的做法是使用httpmodule。 NHibernate in Action描述了两种执行此操作的方法:会话每请求(p334)和会话每会话(p340)。后者允许您跨多个http请求重用持久性实例。除了mausch提供的链接之外,NHibernate in Action还提到了NHibernate Burrow,Castle ActiveRecordRhino Tools

回答

4

IMO最简单的方法是使用一个httpmodule管理会话(session-per-request模式),然后使用依赖注入为控制器提供ISession。

这几乎是the approach used by S#arpothers

NHibernate的LINQ建立在“标准”NHibernate之上,因此所有会话管理模式仍然适用。

不要有这本书,虽然,所以我不知道有多少将不得不改变...

+0

对,你是mausch。我正在尝试使用代码和阅读NHibernate in Action中的代码。我刚刚通过了第10章(持久化的架构模式),他们也描述了这种模式。 – keithm 2009-07-30 22:31:03

0

犀牛下议院是解决了。我在ASP.NET MVC应用程序中使用它工作正常。

+0

在Rhino Commons中有一些代码可以让多个同步会话进行,如果你的webapp真的是ajaxy的话。该代码允许将会话令牌与每个请求一起传递,以便您可以让同一用户一次执行不同的事务。 Crazyness。 – 2009-08-01 20:24:51