代码之家  ›  专栏  ›  技术社区  ›  brainimus user417509

保存或更新后的FindAll不返回更新

  •  0
  • brainimus user417509  · 技术社区  · 16 年前

    代码概要:

    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 回复  |  直到 16 年前
        1
  •  0
  •   Miroslav Popovic    16 年前

    您的FindAll()方法看起来像什么?可能它对两个GetParentById()调用使用了相同的UnitOfWork/Session,而子存储库使用的是另一个UnitOfWork/Session。

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

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

    试着打电话

    Session.Clear();
    

    在GetParentById()方法的顶部。

        2
  •  0
  •   Chris Nicola    16 年前

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

    类似的情况很常见:

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