Как добавить транзакцию nhibernate в ninject? - PullRequest
3 голосов
/ 04 июня 2011

как я могу сделать так, чтобы при каждом http-запросе я начинал транзакцию, и в конце я фиксирую свои транзакции?

Я уже использую InRequestScope для своих сессий и получаю это для моего объекта.

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();
        }

Редактировать

Я знаю, что для ninject установлено значение OnActivation и OnDeactivation

, но я нахожу странным следующее:

   -- statement #1
begin transaction with isolation level: Unspecified

-- statement #2
select TOP ( 1 /* @p0 */ ) student0_.StudentId         

-- statement #3
begin transaction with isolation level: Unspecified

-- statement #4
select TOP ( 1 /* @p0 */ ) student0_.StudentId   

-- statement #5
select courseperm0_.PermissionId    

-- statement #6
begin transaction with isolation level: Unspecified

-- statement #7
commit transaction

-- statement #8
SELECT this_.TaskReminderId as TaskRemi1_13_0_

-- statement #9
SELECT this_.ReminderId                as ReminderId0_2_,

-- statement #10
SELECT this_.ReminderId                as ReminderId8_2_,

Выше приведено в профилировщике, но я удалил большую часть запроса, так как не думал, что это связано с проблемой.

Посмотрите, как неожиданно для утверждения 8,9,10 оно не делаетсделка для.Но до этого получилось 3. Я не понимаю.

Редактировать 2

Я нашел это сообщение

 .OnActivation(session =>
            {
                session.BeginTransaction();
                session.FlushMode = FlushMode.Commit;
            })

Кажется, это немного помогает в моей проблеме (все еще есть проблема с отложенной загрузкой).Мне интересно, почему это работает, и если что-то может пойти не так, используя это.

1 Ответ

2 голосов
/ 04 июня 2011

Добавьте действия активации / деактивации в привязку вашего сеанса:

.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;
    }
}
...