Nhibernate 如何在事务中包装延迟加载?

Nhibernate 如何在事务中包装延迟加载?,nhibernate,ninject,ninject-2,Nhibernate,Ninject,Ninject 2,我使用的是nhibernate和nhibernate配置文件,它一直在抛出此警报 实际上,我通过ninject将所有内容都封装在事务中 public class NhibernateModule : NinjectModule { public override void Load() { Bind<ISessionFactory>().ToProvider<NhibernateSessionFactoryP

我使用的是nhibernate和nhibernate配置文件,它一直在抛出此警报

实际上,我通过ninject将所有内容都封装在事务中

  public class NhibernateModule : NinjectModule
    {
        public override void Load()
        {
            Bind<ISessionFactory>().ToProvider<NhibernateSessionFactoryProvider>().InSingletonScope();
            Bind<ISession>().ToMethod(context => context.Kernel.Get<ISessionFactory>().OpenSession()).InRequestScope()
                                                                                      .OnActivation(StartTransaction)
                                                                                      .OnDeactivation(CommitTransaction);
        }

        public void CommitTransaction(ISession session)
        {

            if (session.Transaction.IsActive)
            {
                session.Transaction.Commit();
            }

        }

        public void StartTransaction(ISession session)
        {
            if (!session.Transaction.IsActive)
            {
                session.BeginTransaction();
            }
        }
    }
公共类NhibernateModule:ninject模块
{
公共覆盖无效负载()
{
Bind().ToProvider().InSingletonScope();
Bind().ToMethod(context=>context.Kernel.Get().OpenSession()).InRequestScope()
.ON激活(启动转换)
.激活(委托交易);
}
公开无效委托交易(ISession session)
{
if(session.Transaction.IsActive)
{
Commit();
}
}
公开作废开始交易(ISession会话)
{
如果(!session.Transaction.IsActive)
{
session.BeginTransaction();
}
}
}
因此,这应该将所有内容都封装在事务中,并且似乎可以处理任何非延迟加载的内容


如果是延迟加载,尽管我得到了错误。我做错了什么。

事实上,这仍然是一个隐式事务,或者与之相对接近。喷油器对激活和停用之间发生的一切一无所知,即使状态不正确或已损坏,它也会乐于尝试提交所有更改

我看到的是,您实际上是在试图欺骗,只是让Ninject在每个请求开始时自动启动事务,并在每个请求结束时提交事务,希望它能阻止NH抱怨。这是非常糟糕的设计,原因如下:

  • 即使会话根本没有使用(即打开虚假连接),您也在强制事务
  • 没有异常处理-如果操作失败或回滚,清理代码将忽略该操作并尝试提交
  • 如果您试图使用
    TransactionScope
    ,这将造成严重破坏,因为范围将在NH事务完成之前完成
  • 您失去了对事务实际发生时间的所有控制,并放弃了(例如)在一个请求中拥有多个事务的能力
  • NH事件探查器完全正确。这不适合使用NH事务。事实上,如果您是延迟加载,那么事务可能会在您仍在迭代结果时被提交,这不是一个好的情况

    如果您希望在事务逻辑上有一个有用的抽象,并且不想处理
    ISession
    对象,那么使用-这就是它的设计目的


    否则,请在实际表示交易的操作周围使用
    子句对交易进行正确编码。是的,这是额外的工作,但你不能如此轻易地通过欺骗摆脱它。

    事实上,这仍然是一个隐式事务,或者与之相对接近。喷油器对激活和停用之间发生的一切一无所知,即使状态不正确或已损坏,它也会乐于尝试提交所有更改

    我看到的是,您实际上是在试图欺骗,只是让Ninject在每个请求开始时自动启动事务,并在每个请求结束时提交事务,希望它能阻止NH抱怨。这是非常糟糕的设计,原因如下:

  • 即使会话根本没有使用(即打开虚假连接),您也在强制事务
  • 没有异常处理-如果操作失败或回滚,清理代码将忽略该操作并尝试提交
  • 如果您试图使用
    TransactionScope
    ,这将造成严重破坏,因为范围将在NH事务完成之前完成
  • 您失去了对事务实际发生时间的所有控制,并放弃了(例如)在一个请求中拥有多个事务的能力
  • NH事件探查器完全正确。这不适合使用NH事务。事实上,如果您是延迟加载,那么事务可能会在您仍在迭代结果时被提交,这不是一个好的情况

    如果您希望在事务逻辑上有一个有用的抽象,并且不想处理
    ISession
    对象,那么使用-这就是它的设计目的


    否则,请在实际表示交易的操作周围使用
    子句对交易进行正确编码。是的,这是额外的工作,但你不能这么轻易地欺骗自己。

    当你说“错误”时,你的意思是“不鼓励隐式事务”?@Merlyn Morgan Graham-是的,这就是我得到的错误,因为出于某种原因,当我通过延迟加载调用它时,它没有将我的语句包装在事务中。这篇博文(评论部分)似乎告诉我,事务对于延迟加载没有意义@Merlyn Morgan Graham-我刚从那篇文章中的一条评论中得到,关于如何更好地管理负载。当你说“错误”时,你的意思是“不鼓励隐式事务”?@Merlyn Morgan Graham-是的,这就是我得到的错误,因为出于某种原因,当我通过延迟加载调用它时,它没有将我的语句包装到事务中。这篇博文(评论部分)似乎在告诉我,事务对于延迟加载毫无意义,@Merlyn Morgan Graham-我刚刚从那篇文章中的一条评论中得知,您应该如何更好地管理负载。工作单元模式如何与存储库/服务层模式协同工作?@chobo2:它们是互补的。UOW的目的是