2010-03-30 3 views
4

이것은 공통적 인 문제인 것처럼 보이지만이를 해결하는 가장 좋은 방법은 모른다. 엔티티를 뷰에 보내고 뷰의 엔티티를 변경 한 다음 사용자가 뷰를 취소하면 해당 변경 사항을 취소 (제거) 할 수 있기를 원합니다. 이것을하는 적절한 방법은 무엇입니까.엔티티에 대한 Hibernate & Canceling 변경

여기에 내가 가지고있는 두 가지 옵션이 있지만 더 나은 다른 사람이해야한다고 생각

1) 업데이트, 변경이 허용하는 경우 ...보기에 클론을 보내 복제를 생성, 엔티티를 타고 클론의 값

2

) 원래 기업은 사용자가 취소하는 경우, NHibernate에의 캐시에서 개체를 제거하고 날 것에 대한 데이터베이스 (2),이 문제에 대한

에서 다시로드 뷰에 엔티티 보내기 캐시에서 제거 된 후에도 이전 엔터티가 여전히 내 프로젝트 전체에서 참조 될 수 있어야합니다.

편집 :

좋아, 그래서 EVICT 방법 내가 방법을 구현하고 있다면 길을 가야하는 것입니다 (2). 고마워, 나는 그 중 하나의 세부 사항을 기억할 수 없었다. 그러나 내 오래된 퇴출 된 엔티티를 참조하는 뷰 객체의 문제는이 문제를 다루기가 어렵습니다. 내 사용자 지정 축출 이벤트가 발생했을 때 각각의 사용자 지정 코드를 리 바인드하지 않고 내 뷰를 자동으로 새 엔터티로 업데이트 할 수는 없습니다. 그리고 리바 인딩은 어떤 경우에는 사소하지 않을 수도 있습니다. 내가 좀 더 복잡해지기 때문에 좀 더 생각할 필요가 있지만, 지금은이 방법이 더 까다로워 보인다.

나는 그 자체의 문제가있는 방법 (1)을 고수 하겠지만 누군가 다른 아이디어가 있는지 좀 더 기다려야 할 것으로 생각한다.

편집 2 : 이것을 발견했습니다. A는 데스크톱 할 일 응용 프로그램 NHibernate에있는 건물 - -이 외에도 http://msdn.microsoft.com/en-us/magazine/ee819139.aspx

, NHibernate에이 Session.Refresh (개체 개체를 가지고 나는 꽤 많은 세부 사항에 대한 답을 커버하고 좋은 데모 프로젝트와 함께 제공됩니다 생각) 함수 정확한 문제를 해결하는 것 같습니다. 따라서 엔티티가 변경되었지만 저장 전에 취소 된 경우 Session.Refresh를 호출하여 데이터베이스에서 다시로드하고 변경 사항을 무시할 수 있습니다.

+0

'엔티티가 관계를 계단식 때 Refresh'가 발생하는 경우, 그 자녀 (관련 단체)도 새로 고쳐집니다있는 일반적인 문제 -이 발생할 수 띄는 성능에 미치는 영향. 방금 설명한 문제에 직면했기 때문에이 정보가 다른 사용자에게 도움이 될 수 있습니다. – jweyrich

답변

1

옵션 1을 사용하고 엔티티 대신 ViewModel을 사용합니다. ViewModel은 특정보기에 대한 사용자 모델을 나타냅니다. ViewModel에서 다른 엔티티의 데이터를 혼합하고 미리보기 값을 뷰에 맞출 수 있습니다. 보기에 데이터를 전달하는 우아한 방법이며 원하는 것을 쉽게 성취 할 수 있습니다.

ViewModels를 사용하는 것이 ASP.net MVC 및 Silverlight/WPF에서 작업하는 기본 방법이되고 있습니다.

은 Viewmodels에 대한 자세한 내용을 읽으려면 : http://blogs.msdn.com/dphill/archive/2009/01/31/the-viewmodel-pattern.aspx

+0

이 솔루션을 사용하여 다소 종료되었습니다. 나는 이상하다고 생각하지는 않는다. 때때로 엔티티가 내 관점에 있어야하는 것을 정확히 포함하고 있으며, 속성을 다른 것으로 복사해야하는 것을 좋아하지 않기 때문이다. 그래도 대부분은 괜찮을 것 같습니다. 감사합니다. – i8abug

+0

결국 익숙해집니다. Automapper를 사용하면 데이터를 앞뒤로 복사 할 때의 어려움을 덜 수 있습니다. http://automapper.codeplex.com/ –

+0

처음에는 고통 스럽지만 모델/데이터의 모양을보기에 적합한 것으로 바꿀 수 있도록 두 번째 유형을 구현하는 아이디어로 비명을 지르고 싶었습니다! - 나는 거의 1 년 동안이 아이디어에 맞서 싸웠고 결국 NH와 ASP.NET MVC가 다른 접근법을 위해 설계되지 않았다는 사실에 직면해야했습니다. 비록 그것이 당신을 싫증 나게 할지라도, 저는 당신이 드라이를 잊어 버리고 고도의 복제를 받아들이도록 강력하게 조언합니다; 그 도구가 설계된 것입니다. 하천과의 수영은 통증과 실질적인 보상을 초래할 것입니다. –

1

이 작업을 수행하는 가장 좋은 방법은 ISession에서 Evict 메서드를 호출하여 개체를로드하는 것입니다. 이렇게하면 세션 캐시에서 개체가 제거됩니다. 그런 다음 다시로드하고 다시 표시 할 수 있습니다.

세션에서 개체를 제거하면 transient가됩니다. 프로젝트에서이 개체에 대한 참조가 여전히 있으면 세션이 플러시 될 때 유지되지 않습니다. 처리 방법은 애플리케이션에 따라 다르지만 구독자에게 개체를 다시로드해야한다고 알리는 이벤트를 발생시키는 것이 좋습니다.

관련 문제