Asp.net mvc 3 如何将nhibernate事务添加到ninject?

Asp.net mvc 3 如何将nhibernate事务添加到ninject?,asp.net-mvc-3,ninject,ninject-2,Asp.net Mvc 3,Ninject,Ninject 2,如何在每次http请求中启动事务并在最后提交事务时都这样做 我已经将InRequestScope用于我的会话,并将其用于我的ninject public class NhibernateSessionFactory { public ISessionFactory GetSessionFactory() { ISessionFactory fluentConfiguration = Fluently.Configure()

如何在每次http请求中启动事务并在最后提交事务时都这样做

我已经将InRequestScope用于我的会话,并将其用于我的ninject

public class NhibernateSessionFactory
    {
        public ISessionFactory GetSessionFactory()
        {
           ISessionFactory fluentConfiguration = Fluently.Configure()
                                                  .Database(MsSqlConfiguration.MsSql2008.ConnectionString(c => c.FromConnectionStringWithKey("ConnectionString")))
                                                  .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Map>().Conventions.Add(ForeignKey.EndsWith("Id")))
                                                  .ExposeConfiguration(cfg => cfg.SetProperty("adonet.batch_size", "20"))
                                                  //.ExposeConfiguration(BuidSchema)
                                                  .BuildSessionFactory();

            return fluentConfiguration;
        }

        private static void BuidSchema(NHibernate.Cfg.Configuration config)
        {
            new NHibernate.Tool.hbm2ddl.SchemaExport(config).Create(false, true);
        }
    }


public class NhibernateSessionFactoryProvider : Provider<ISessionFactory>
    {   
        protected override ISessionFactory CreateInstance(IContext context)
        {
            var sessionFactory = new NhibernateSessionFactory();
            return sessionFactory.GetSessionFactory();
        }
    }

  public class NhibernateModule : NinjectModule
    {
        public override void Load()
        {
            Bind<ISessionFactory>().ToProvider<NhibernateSessionFactoryProvider>().InSingletonScope();
            Bind<ISession>().ToMethod(context => context.Kernel.Get<ISessionFactory>().OpenSession()).InRequestScope();
        }
上面的内容来自于分析器,但我去掉了大部分查询,因为我认为这并不能解决问题

看看报表8、9、10是如何突然之间没有进行交易的。但在此之前,它是3。我不明白

编辑2

我找到了这个


这似乎对我的问题有点帮助(仍然存在延迟加载的问题)。我想知道为什么会这样,如果使用它会出现问题。

将激活/取消激活操作添加到会话绑定中:

.OnActivation(session => session.Transaction.Begin())
.OnDeactivation(CommitTransaction)

public void CommitTransaction(ISession session)
{
    try 
    {
        session.Transaction.Commit();
    }
    catch(Exception e)
    {
        // Add some exception handling (rollback, show error to user, ...) 
        throw;
    }
}

@雷莫·格洛尔-好的,我得到第一个。激活,但我没有得到停用。您有“CommitTransaction”,然后您得到了一个名为BeingTransaction的方法,它似乎提交了事务。我觉得很奇怪,因为我会认为这是最终交易。我的错应该是提交交易。错误地复制了代码。@Remo Gloor-我应该先检查事务是否处于活动状态吗?我想我不需要关闭会话,因为ninject应该处理这个问题。@chobo2如果有人在某个时候关闭了事务,您应该检查一下。我的例子只显示了应该在哪里开始和结束。确切的实现取决于应用程序的其余部分。@Remo Gloor-我发现每次我使用延迟加载时,虽然它不会在事务中包装这些内容,但其他所有内容都会包装到一个事务中。
 .OnActivation(session =>
            {
                session.BeginTransaction();
                session.FlushMode = FlushMode.Commit;
            })
.OnActivation(session => session.Transaction.Begin())
.OnDeactivation(CommitTransaction)

public void CommitTransaction(ISession session)
{
    try 
    {
        session.Transaction.Commit();
    }
    catch(Exception e)
    {
        // Add some exception handling (rollback, show error to user, ...) 
        throw;
    }
}