2009-09-18 8 views
1

이 질문은 속임수이지만, 나는 여전히 플러싱을 처리하는 가장 좋은 방법을 이해하지 못합니다. 나는 FooRepository.Save 방법을 사용해야 제가 NHibernate에에 FooRepository을 변경하고 이제NHibernate에서 플러시

private void btnSave_Click() 
{ 
    SaveForm(); 
    ReloadList(); 
} 

private void SaveForm() 
{ 
    var foo = FooRepository.Get(_editingFooId); 

    foo.Name = txtName.Text; 

    FooRepository.Save(foo); 
} 

private void ReloadList() 
{ 
    fooRepeater.DataSource = FooRepository.LoadAll(); 
    fooRepeater.DataBind(); 
} 

:

나는 다음과 같은 코드를 많이 포함 된 기존 코드베이스를 마이그레이션하는 건가요? 엔티티가 저장 될 때 항상 FooRepository가 세션을 플러시해야합니까?

답변

3

는 제가 질문을 이해한다면 모르겠지만, 여기에 내가 무슨 생각입니다 :

는 "세션에 객체를 넣어"대신 "점점 데이터를 저장하는"생각하십시오. 뉴 햄프셔에서는 새로운 콜과 변경된 오브젝트를 특별한 호출없이 세션에 저장합니다. 어떤 쿼리는 데이터베이스에서

  • 가져 오기 데이터 :

    데이터 변경 :

    이 시나리오를 고려하십시오. 엔티티가 NH 세션에 있습니다.

  • 속성 값을 변경하여 엔티티를 변경하십시오.
  • 트랜잭션을 커밋하십시오. 변경 사항은 플러시되고 데이터베이스에 저장됩니다.

는 새로운 객체를 생성합니다

  • 전화 생성자를 "저장"을 호출하여 새로운 오브젝트를 데이터베이스에
  • 스토어를 만들 수 있습니다. 이제 세션에 있습니다.
  • 저장 후에도 오브젝트를 변경할 수 있습니다.
  • 변경 사항을 적용하십시오. 최신 상태가 데이터베이스에 저장됩니다.

분리 된 엔티티를 사용하는 경우 분리 된 엔티티를 세션에 넣으려면 Update 또는 SaveOrUpdate도 필요합니다.

물론 NH가 다르게 동작하도록 구성 할 수 있습니다. 그러나이 기본 동작을 따르는 것이 가장 효과적입니다.

1

Foo 엔티티를 수정하고 저장소에서 모든 Foos를로드하는 사이에 세션을 명시 적으로 플러시할지 여부는 중요하지 않습니다. NHibernate는 실행하려고하는 질의의 결과에 영향을 미칠 수있는 세션을 변경 한 경우 자동으로 자동 플러시 될만큼 똑똑합니다.

"작업 단위"당 하나의 세션을 사용하는 것이 가장 좋습니다. 이것은 몇 가지 작은 단계를 포함 할 수있는 하나의 응집 된 작품을 의미합니다. 이 작업을 수행 할 수있는 아키텍처의 솔기가 없다고 생각되면 리포지토리에서 세션 관리가 작동합니다. 그냥 당신이 NHibernate가 제공하는 몇 가지 힘을 놓치고 있다는 것을 알아 두십시오.

1

내가 할 수 있다면 나는 스테판 모저의 답변을 투표 할 것 - 나는 아직도 NH와 그립에지고있어 자신을하지만 나는이 같은 코드를 쓸 수 있도록 좋은 생각 :

private void SaveForm() 
{ 
    using (var unitofwork = UnitOfWork.Start()) 
    { 
     var foo = FooRepository.Get(_editingFooId); 
     var bar = BarRepository.Get(_barId); 

     foo.Name = txtName.Text; 
     bar.SomeOtherProperty = txtBlah.Text; 

     FooRepository.Save(foo); 
     BarRepository.Save(bar); 

     UnitOfWork.CommitChanges(); 
    } 
} 

을 이러한 방식 전체 동작이 성공하거나 실패하고 롤백되어 플러싱/트랜잭션 관리가 리포지토리 외부에 유지됩니다.