使用 ASP.NET MVC 3 的 NHibernate session + 事务

标签 nhibernate asp.net-mvc-3

我目前正在编写一个新应用程序,尽管公司标准是使用 NHibernate(因为这是所有项目的标准),但由于 ASP.NET MVC 3 现在已经成熟,所以我正在使用它。我已经在 Controller 中实现了我的事务(这应该是你应该这样做的方式),所以它在我的根 Controller 中看起来像这样:

[TransactionPerRequest]
public class FbsController : Controller
{

}

然后我的所有 Controller 都继承自这个FbsController。这样做的原因是因为我所有操作的 90% 都会发送到数据库,因此创建事务并为剩余 10% 的操作(很少会执行)处理它的开销是不值得的使用 [TransactionPerRequest] 装饰每个操作。

一直困扰我的是 NHibernate session 。在存储库中,这与我拥有的东西类似,尽管这在其他项目中有所不同:

    public void Add(User user)
    {
        using (ISession session = NHibernateHelper.OpenSession())
        {
            session.Save(user);
        }
    }

    public void Remove(User user)
    {
        using (ISession session = NHibernateHelper.OpenSession())
        {
            session.Delete(user);
        }
    }

    public User GetById(int userId)
    {
        using (ISession session = NHibernateHelper.OpenSession())
        {
            return session.QueryOver<User>()
                .Where(c => c.UserID == userId)
                .SingleOrDefault();
        }
    }

因此,对于我的存储库中的大多数功能,我必须打开一个 session 。有什么方法可以避免这种行为,这样我就不必在每个存储库方法中打开 session ?这似乎有点违反直觉,因为我通常必须为每一个都这样做。我想知道其他人对交易和 session 问题的解决方案是什么,我看到代码中以各种方式散布着这个问题。

实际上,我希望我的存储库方法如下所示:

    public void Add(User user)
    {
        session.Save(user);
    }

    public void Remove(User user)
    {
        session.Delete(user);
    }

    public User GetById(int userId)
    {
        return session.QueryOver<User>()
            .Where(c => c.UserID == userId)
            .SingleOrDefault();
    }

一切都被隐式处理。

最佳答案

关于使用 ASP.NET MVC 3 的 NHibernate session + 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5908737/

相关文章:

c# - 是什么阻止了这个任务长时间运行?

c# - 如何隐藏 miniprofiler?

c# - 如何使用带有复选框和下拉菜单的自动回发?

c# - 如何指示 Entity Framework 不要更新模型的属性

nhibernate - Fluent Nhibernate 中的自定义 Tuplizer

c# - 对 MembershipUser 的流畅 NHibernate 引用

.net - 通用存储库。需要建议

nhibernate - 当数据库发生更改时,您如何管理ORM层?

asp.net-mvc-3 - jQuery.validator.unobtrusive.adapters.addMinMax 往返,在 MVC3 中不起作用

c# - 使用 DefaultCascade.All() 将实体添加到列表时,Nhibernate 不会设置 Id