как я могу сделать так, чтобы при каждом 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;
})
Кажется, это немного помогает в моей проблеме (все еще есть проблема с отложенной загрузкой).Мне интересно, почему это работает, и если что-то может пойти не так, используя это.