gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 13:22:58 25 4
gpt4 key购买 nike

我怎样才能在每个 http 请求上启动一个事务并在最后提交我的事务?

我已经在我的 session 中使用 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();
}

编辑

我知道 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

我找到了这个 post

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

这似乎对我的问题有点帮助(仍然有延迟加载的问题)。我想知道为什么这会起作用,以及使用它是否会出错。

最佳答案

将激活/停用操作添加到您的 session 绑定(bind):

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

关于asp.net-mvc-3 - 如何将 nhibernate 事务添加到 ninject?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6235026/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com