我知道这已被问过,但我无法解决这个问题。
假设您有一个具有集合的nhibernate对象。
问题是,如果集合中的某个对象是由不同的用户在数据库中更新的(我手动修改了数据库的测试目的),我似乎找不到让nhibernate刷新集合值的方法。 / p>
我试过刷新,逐出,加载againg ......只关闭会话并创建一个新会议。但我觉得这个解决方案有问题,告诉nhibernate“老兄,刷新集合中的项目”有多难?
但无论如何我无法让它发挥作用。
非常感谢
答案 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();
}
}
}