我正在使用nhibernate和nhibernate配置文件继续抛出此警报。
Use of implicit transactions is discouraged"
我实际上是通过ninject
将事务中的所有内容包装起来 public class NhibernateModule : NinjectModule
{
public override void Load()
{
Bind<ISessionFactory>().ToProvider<NhibernateSessionFactoryProvider>().InSingletonScope();
Bind<ISession>().ToMethod(context => context.Kernel.Get<ISessionFactory>().OpenSession()).InRequestScope()
.OnActivation(StartTransaction)
.OnDeactivation(CommitTransaction);
}
public void CommitTransaction(ISession session)
{
if (session.Transaction.IsActive)
{
session.Transaction.Commit();
}
}
public void StartTransaction(ISession session)
{
if (!session.Transaction.IsActive)
{
session.BeginTransaction();
}
}
}
所以这应该包装一个事务中的所有东西,它似乎适用于任何非延迟加载的东西。
如果它是延迟加载但我收到错误。我做错了什么。
答案 0 :(得分:1)
我看到的是你实际上是在试图作弊,只是让Ninject在每个请求开始时自动启动一个事务,并在每个请求结束时提交事务,希望它能阻止NH抱怨。由于以下几个原因,这是非常糟糕的设计:
TransactionScope
,这将造成严重破坏,因为范围将在NH交易之前完成。NH Profiler完全正确。这不适合使用NH交易。实际上,如果你是延迟加载,那么当你仍在迭代结果时,事务可能最终被提交 - 这不是一个好的情况。
如果你想在事务逻辑上使用有用的抽象,并且不想使用ISession
个对象,那么使用Unit Of Work pattern - 这就是它的设计目标
否则,请正确编码您的交易,并在实际代表交易的操作周围加上using
子句。是的,这是额外的工作,但你不能轻易地欺骗它。