数据库中有一组数据,运行集成测试。为了防止数据库中的NHibernate持久化对象修改,实现了继承自 DefaultSaveOrUpdateEventListener 的EventListener。
然后有一个方法:
public override void OnSaveOrUpdate(SaveOrUpdateEvent @event)
{
@event.Session.CancelQuery();
Trace.TraceWarning("NhibernateSaveUpdateCanceler: Persistence will be ignored.");
}
不幸的是,这不能按预期工作。所以预期的行为是抓住在数据库中写入更改的时刻,并通过离开对象以某种方式取消它,因为可以对它们进行如此修改。
感谢。
修改
无法做到这一点,因为测试方法中存在多个事务,因此通过持久化更改使需求存在矛盾,以便从一方可用于所有事务,并且更改在数据库中不会持久保存。
答案 0 :(得分:2)
调用session.Save
或session.Update
时调用SaveOrUpdate事件侦听器。刷新更改时,将为每个实体调用FlushEntity事件。实施IFlushEntityEventListener
。
答案 1 :(得分:1)
使用Integration测试夹具库重新编写集成测试。在基类中创建: 一个夹具设置,初始化nhibernate并创建一个会话工厂 关闭会话工厂的夹具拆解 一个创建会话和事务的测试设置 测试拆解,回滚事务并关闭会话。
像这样[TestFixture]
public abstract class TestFixtureBase
{
protected ISessionFactory SessionFactory { get; private set; }
protected ISession Session { get; private set; }
protected ITransaction Tx { get; private set; }
[TestFixtureSetUp]
public virtual void SetUp()
{
var nh = new NHInit();
nh.Initialize();
SessionFactory = nh.SessionFactory;
}
[TestFixtureTearDown]
public virtual void TearDown()
{
SessionFactory.Close();
}
[SetUp]
public void Test_Set_Up()
{
Session = SessionFactory.OpenSession();
Tx = Session.BeginTransaction();
}
[TearDown]
public void Test_tear_down()
{
Tx.Rollback();
Tx.Dispose();
Session.Close();
}
}
然后写下你的测试。