我可以在NHibernate中管理实体状态吗?

时间:2012-03-01 06:06:20

标签: c# nhibernate frameworks entity status

最近,我正在尝试在我的项目中使用NHibernate。见下面的代码

var _sessionFactory = cfg.BuildSessionFactory();
        var _session = _sessionFactory.OpenSession();
        var user = new User() {UserName = "carl", Gender = 1};
        _session.Save(user);
        _session.Delete(user);
        _session.Flush();
        _session.Close();
        _sessionFactory.Dispose();

NHibernate会将用户保存到db中,然后从db中删除它。我知道代码很奇怪,但我真的希望NHibernate知道你真的不需要访问db两次。实体框架将工作不同,它将在内存中切换用户对象的状态,当执行刷新时,它将访问数据库以使其持久化。当然,用户哪个状态被标记为已删除将不会被持久化。所以这里不需要数据库访问。这就是我想要的!!

有没有人知道NHibernate有这样的接口来改变像EF那样的实体状态?

2 个答案:

答案 0 :(得分:0)

将实体保存到数据库的原因是因为您可能使用身份ID生成,迫使NH立即插入。如果您使用其他策略,例如HiLo,您会看到您的预期。

答案 1 :(得分:0)

首先,身份标识会触发数据库上的插入,你无法帮助它。但是,更改为hi-lo仍然不能保证不会发生插入。原因在于NHibernate的NHessnateSessionFactory生成的ISession和默认的FlushMode。

参见NHibernate Reference中的第9.7节,其中解释了FlushMode机制。对于您的情况,您应该将FlushMode设置为Never(FlushMode.Never),以便不会发生幕后刷新。