【问题标题】:NHibernate Linq Session ManagementNHibernate Linq 会话管理
【发布时间】: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 ArchitectureHybridSessionBuilder。有人用这些来用 NHibernate Linq 替换 Linq to Sql 吗?还有其他更好的方法吗?

**编辑 mausch 说得对——解决这个问题的常用方法是使用 httpmodule。 NHibernate in Action 描述了两种方法:每个请求会话 (p334) 和会话每个会话 (p340)。后者允许您跨多个 http 请求重用持久实例。除了 mausch 提供的链接之外,NHibernate in Action 还提到了NHibernate BurrowCastle ActiveRecordRhino Tools

【问题讨论】:

    标签: asp.net-mvc linq nhibernate


    【解决方案1】:

    IMO 最简单的方法是拥有一个管理会话的 httpmodule(每个请求的会话模式),然后使用依赖注入将 ISession 提供给控制器。

    这几乎是the approach used by S#arpothers

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

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

    【讨论】:

    • 对,你是mausch。我正在试验代码并阅读 NHibernate in Action。我刚读完第 10 章(持久性的架构模式),他们也描述了这种模式。
    【解决方案2】:

    Rhino Commons 也是一个解决方案。我在 ASP.NET MVC 应用程序中使用它工作正常。

    【讨论】:

    • 如果你的 webapp 真的是 ajaxy,在 Rhino Commons 中有一些代码可以同时进行多个会话。该代码允许与每个请求一起传递会话令牌,以便您可以让同一用户同时执行不同的事务。疯狂。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多