Asp.net mvc 3 如何将nhibernate事务添加到ninject?
如何在每次http请求中启动事务并在最后提交事务时都这样做 我已经将InRequestScope用于我的会话,并将其用于我的ninjectAsp.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()
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;
}
}