3
我該如何讓每一個http請求都能這樣我開始一個事務,並在最後提交我的事務?如何將nhibernate事務添加到ninject?
我已經在使用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;
})
看來這確實有點幫助與我的問題(仍然有延遲加載的問題)。我想知道爲什麼這可以工作,如果有什麼可以通過使用這個錯誤。
@Remo Gloor - 好吧,我得到的第一個。在激活但我沒有得到停用。你有「CommitTransaction」,然後你有一個稱爲BeingTransaction的方法,似乎提交了交易。看到奇怪,因爲我會認爲這將是EndTransaction。 – chobo2 2011-06-04 19:23:24
我的錯應該是CommitTransaction。錯誤地複製了代碼。 – 2011-06-05 12:04:03
@ Remo Gloor - 我不應該先檢查交易是否有效嗎?我想我不需要關閉會議,因爲ninject應該注意這一點。 – chobo2 2011-06-05 20:08:29