SaveOrUpdate不返回更新后FindAll

时间:2010-01-13 00:40:14

标签: c# nhibernate

我有一个查询父记录的数据库(在本例中为视图)的方法,获取并更新每个父记录的子项,保存子记录,然后查询父记录。子和父之间存在一对一的关系,但关系未在映射文件中定义。通过直接向数据库发出select,我可以看到更新正在保存到数据库中,但是当我在代码中执行第二次查询时,更新不包含在结果中。为什么第二个查询没有返回更新?

代码粗略轮廓:

public void UpdateRecords(long aParentId)
{
   IList<Parent> parents = parentRepository.GetParentById(aParentId);
   foreach (Parent parent in parents)
   {
      Child childToUpdate = childRepository.GetChildById(parent.GetChildId());

      ... Update Child ...

      childRepository.SaveChild(childToUpdate);
   }
   IList<Parent> parents = parentRepository.GetParentById(aParentId);
}

class ParentRepository : NHRepository
{
   public IList<Parent> GetParentById(long anId)
   {
      DetachedCriteria criteria = 
         DetachedCriteria.For<Parent>()
         .Add(Restrictions.Eq("Id", anId));

      return FindAll(criteria).ToList();
   }
}

class ChildRepository : NHRepository
{
   public Child SaveChild(Child aChild)
   {
      Child savedChild = null;
      using (UnitOfWork.Start())
      {
         savedChild = base.SaveOrUpdate(aChild);
         UnitOfWork.Current.Flush(); // commit
      }
      return savedChild;
   }
}

2 个答案:

答案 0 :(得分:0)

您的FindAll()方法是什么样的?它可能是对GetParentById()调用使用相同的UnitOfWork / Session,而子存储库正在使用另一个UnitOfWork / Session。

如果是这种情况,则第二个GetParentById()调用是从会话(第一级)缓存返回对象,而不是访问数据库。

编辑:您可以浏览Rhino.Commons的源代码:

https://rhino-tools.svn.sourceforge.net/svnroot/rhino-tools/trunk/commons/Rhino.Commons.NHibernate/

Session封装在Rhino.Commons.UnitOfWork类中。我不熟悉Ayende对UnitOfWork的实现,所以我无法为你提供最好的解决方案,但是这里有一些东西可以让你入门....

尝试致电

Session.Clear();

位于GetParentById()方法的顶部。

我再说一遍,你可能需要找到一个更好的方法(可能是通过使用UnitOfWork),但这应该清除会话缓存中的所有对象,从而在下次请求时从数据库中加载新对象。

答案 1 :(得分:0)

尝试在事务中包围SaveUpdate()。然后在完成后提交事务,这将确保在您提交时将更改写入数据库:

这样的事情很常见:

using (var trans = session.BeginTransaction()) {
  session.SaveUpdate(e);
  trans.Commit()
} catch (Exception) {
  trans.Rollback()
}