2010-01-13 4 views
0

부모 레코드에 대해 데이터베이스 (이 경우보기)를 쿼리하고 각 부모 레코드의 자식을 가져 와서 업데이트 한 다음 자식 레코드를 저장 한 다음 부모 레코드를 쿼리하는 메서드가 있습니다. . 하위와 상위 간에는 일대일 관계가 있지만 관계는 매핑 파일에 정의되어 있지 않습니다. 데이터베이스에 직접 select를 실행하여 업데이트가 데이터베이스에 저장되는 것을 볼 수 있지만 코드에서 두 번째 쿼리를 수행하면 업데이트가 결과에 포함되지 않습니다. 두 번째 쿼리가 업데이트를 반환하지 않는 이유는 무엇입니까? 코드의SaveOrUpdate가 업데이트를 반환하지 않은 후 FindAll

거친 개요 :

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; 
    } 
} 

답변

0

무엇() 메소드처럼 findall은 보입니까? GetParentById() 호출에 대해 동일한 UnitOfWork/Session을 사용하고 그 하위 저장소가 다른 UnitOfWork/Session을 사용하고있을 가능성이 있습니다.

이 경우 두 번째 GetParentById() 호출은 데이터베이스를 치지 않고 세션 (첫 번째 수준) 캐시에서 개체를 반환합니다.

편집 :

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

세션이 Rhino.Commons.UnitOfWork 클래스에 캡슐화됩니다 : 당신은에 Rhino.Commons의 소스 코드를 탐색 할 수 있습니다.

에 한번 전화를 .... 나는 UnitOfWork에의 Ayende의 구현에 익숙하지 않은, 그래서 나는 당신이에 가장 적합한 솔루션을 제공 할 수 없습니다, 그러나 여기 당신이 시작하는 일이다

Session.Clear(); 

GetParentById() 메서드 맨.

반복하기 때문에 아마도 UnitOfWork를 사용하여 더 나은 방법을 찾아야하지만 세션 캐시의 모든 개체를 지워야하므로 다음 요청시 데이터베이스에서 새로운 개체를로드해야합니다.

+0

나도 몰라 무엇 findall은 방법 보이는 군. 나는 코뿔소에서 가져올거야. 명반. 면역 강화베이스 . – brainimus

+0

세션을 지우십시오. 내 대답을 업데이트했습니다. –

0

트랜잭션에서 SaveUpdate()를 둘러보십시오. 그런 다음 완료되면,이 변경 사항이 커밋 데이터베이스 오른쪽에 기록됩니다 보장합니다 트랜잭션을 커밋 :

이 같은

뭔가보고 매우 일반적입니다 :

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