如何使Nhibernate不要将对象的更改持久化到数据库中

时间:2011-10-10 09:45:38

标签: nhibernate

数据库中有一组数据,运行集成测试。为了防止数据库中的NHibernate持久化对象修改,实现了继承自 DefaultSaveOrUpdateEventListener 的EventListener。

然后有一个方法:

public override void OnSaveOrUpdate(SaveOrUpdateEvent @event)
{
  @event.Session.CancelQuery();
  Trace.TraceWarning("NhibernateSaveUpdateCanceler: Persistence will be ignored.");
}

不幸的是,这不能按预期工作。所以预期的行为是抓住在数据库中写入更改的时刻,并通过离开对象以某种方式取消它,因为可以对它们进行如此修改。

感谢。

修改

无法做到这一点,因为测试方法中存在多个事务,因此通过持久化更改使需求存在矛盾,以便从一方可用于所有事务,并且更改在数据库中不会持久保存。

2 个答案:

答案 0 :(得分:2)

调用session.Savesession.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();
    }
}
然后写下你的测试。