NHIbernate刷新系列

时间:2012-11-12 19:29:35

标签: c# nhibernate collections

我知道这已被问过,但我无法解决这个问题。

假设您有一个具有集合的nhibernate对象。

问题是,如果集合中的某个对象是由不同的用户在数据库中更新的(我手动修改了数据库的测试目的),我似乎找不到让nhibernate刷新集合值的方法。 / p>

我试过刷新,逐出,加载againg ......只关闭会话并创建一个新会议。但我觉得这个解决方案有问题,告诉nhibernate“老兄,刷新集合中的项目”有多难?

但无论如何我无法让它发挥作用。

非常感谢

3 个答案:

答案 0 :(得分:1)

这实际上不应该起作用,这就是为什么它没有。

NHibernate默认使用会话级缓存来优化读取和跟踪修改。

听起来您没有使用正确的数据访问工作单元,因为您的会话应该缩小范围并仅在您需要时使用。

如果这是网络应用的一部分,建议您遵循“按请求进行会话”的方法。

如果你真的想让它起作用,你可能会从会话中驱逐实体和它的孩子,强迫重新获取,但这是令人讨厌的,我真的不建议它。

答案 1 :(得分:0)

遇到了试图驱逐,甚至考虑开始和结束会议的麻烦。听起来好像代码中有足够的顶空来考虑进行过滤获取,即获取集合类型的所有项目,其中父标识是父对象的标识。您可能需要扩展您的存储库或dao,具体取决于您使用NH的方式,但正如其他人所说,如果没有示例,很难更具体。重点是您在该类型的查询中获取子对象,并按父ID进行过滤。

这将是一个新鲜的获取,因此您将获得由其他进程创建的任何新的或更改的对象,然后您可以将该集合设置为父对象中的集合。当您尝试保存时,NH应该克服这个问题,因为它可以对您的对象进行假设并保存或更新。如果在获取父对象和再次保存父对象之间可能存在一些时间延迟,这可能对您有用。

这种方法的问题是需要一种合并类型操作。您可能希望添加在进程中创建的任何新对象,以便在更新集合时不会丢失更改。希望这会有所帮助,如果你仍然被卡住,请给我们更多信息。

答案 2 :(得分:0)

您应该在SessionFactory Class中实现IDispose接口。

就像这样:

public class YouSessionFactory : INHibernateSessionFactory, IDisposable
{
    private ISessionFactory _sessionFactory;

    //codes for initial _sessionFactory, for configuration,mapping or something else.
    //balalalalalala
    //....

    public ISessionFactory BuildSessionFactory()
    {
        return _sessionFactory;
    }

    public void Dispose()
    {
        if (!_sessionFactory.IsClosed || _sessionFactory != null)
        {
            _sessionFactory.Close();
            _sessionFactory.Dispose();
        }
    }
}