出于某种原因:
[Transaction]
public void DoSomething()
{
...
}
不起作用我仍然必须明确使用这样的事务:
public void DoSomething()
{
using (var tx = NHibernateSession.Current.BeginTransaction())
{
....
tx.Commit();
}
}
任何想法为什么?
我正在使用这样的东西来引导东西:
_container = new WindsorContainer();
ComponentRegistrar.AddComponentsTo(_container);
...
ServiceLocator.SetLocatorProvider(() => new WindsorServiceLocator(_container));
ComponentRegistrar.AddComponentsTo(_container, typeof(NHibernateTransactionManager));
NHibernateSession.Init(new ThreadSessionStorage(),
new[] { "Bla.Domain.dll" },
new AutoPersistenceModelGenerator().Generate(),
"NHibernate.config");
答案 0 :(得分:1)
正如Doan所说,拥有该方法的组件未被代理。
由于该方法不是虚拟的,我假设您的类正在实现一个接口。确保在类中调用DoSomething定义为接口而不是实现类。
如果你调试代码,并检查对象的运行时类型,它应该是城堡代理
有关详细信息,请查看Sharp Architecture contrib wiki上的故障排除部分 https://github.com/sharparchitecture/Sharp-Architecture-Contrib/wiki/Troubleshooting
答案 1 :(得分:0)
通常,这种问题是由调用提供事务管理服务的动态代理失败引起的。两个最常见的错误是:
编辑:
我猜你使用Castle Windsor作为IoC容器。 [Transaction]
装饰需要自动交易管理工具才能运作。如果您成功配置了设施,即您使[Transaction]
在一种方法中工作,而不是在其他方法中工作,则上述答案适用。如果所有交易装饰都无法工作,则必须先检查设施的配置。