我第一次尝试使用事件监听器。我见过的所有样本都显示了配置是多么容易,但由于某些原因我遇到了麻烦 - 似乎没有被调用。我怀疑我错过了一些明显的东西。
我试过这个:
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory name="TerraCognita.LoanExpress">
<!-- other stuff... -->
<listener type="delete" class="Test.TestDeleteListener, MyDllName" />
</session-factory>
</hibernate-configuration>
以及:
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory name="TerraCognita.LoanExpress">
<!-- other stuff... -->
<event type="delete">
<listener class="Test.TestDeleteListener, MyDllName" />
</event>
</session-factory>
</hibernate-configuration>
加载配置并构建会话工厂时:
var cfg = new NHibernate.Cfg.Configuration();
cfg.AddAssembly("MyDllName");
sessionFactory = cfg.BuildSessionFactory();
实例化之后,cfg.EventListeners.DeleteEventListeners有一个类型为DefaultDeleteEventListener的条目(正如我所期望的那样)。但是,在调用cfg.AddAssembly后,仍然是这种情况 - 但是根据配置,我希望DeleteEventListener实际上应该是TestDeleteListener类型。
在我的单元测试中,我可以让我的事件监听器工作的唯一方法是手动将其添加到会话信息中:
var sess = GetSession();
sess.GetSessionImplementation().Listeners.DeleteEventListeners =
new NHibernate.Event.IDeleteEventListener[] { new TestDeleteListener() };
我知道这不应该是必需的,我应该能够正确配置它。任何人都可以对我在这里做错了吗?
答案 0 :(得分:1)
您的配置正常,只是您忽略了致电cfg.Configure()
。将您的初始化代码更改为此以及您的罚款:
var cfg = new NHibernate.Cfg.Configuration();
cfg.Configure();
cfg.AddAssembly("MyDllName");
sessionFactory = cfg.BuildSessionFactory();