문제

우리는 DTO 패턴을 사용하여 서비스 계층에서 저장소로 도메인 객체를 마샬링 한 다음 NHibernate를 통해 데이터베이스로 내려갑니다.

리포지토리 (예 : CustomerDTO)에서 DTO를 꺼낸 다음 서비스 계층의 도메인 개체 (고객)로 변환하는 문제가 발생합니다. 그런 다음 동일한 고객 객체가 포함 된 새 개체를 다시 저장하려고합니다 (예 : Salesorder). 이는 저장소로 밀기 위해 SalesOrderDTO (및 CustomerDTO)로 변환됩니다.

nhibernate는 이것을 좋아하지 않습니다. CustomerDTO는 중복 레코드라고 불평합니다. 나는 이것이 같은 세션에서 첫 번째 CustomerDTO를 꺼내고 반환이 앞뒤로 변환 되었기 때문에 동일한 개체로 인식 할 수 없다고 가정합니다.

내가 여기에 갇혀 있나요 아니면 이것에 대한 방법이 있습니까?

감사

제임스

도움이 되었습니까?

해결책

잠금을 사용하여 nhibernate 세션에 객체를 다시 붙일 수 있습니다 - 예 :

_session.Lock(myDetachedObject, NHibernate.LockMode.None);

여기서 일어나는 일에 따라 도움이 될 수 있습니다. 참고로, Nhibernate와 함께 DTO를 사용하는 것이 가장 일반적인 관행이 아니며, Nhibernate (대부분)가 지속성 무지를 지원한다는 사실은 일반적으로 DTO가 다른 ORM 프레임 워크와 마찬가지로 널리 사용되지 않음을 의미합니다.

다른 팁

실제로 nhibernate 세션이 어떻게 작동하는지에 관한 것입니다. 따라서 세션 내에서 CustomerDTO의 인스턴스를 가져 오면 잠시 후에 동일한 CustomerDTO (기본 키에 의해)를 가져와야합니다. 실제로 첫 번째 검색에서했던 것과 같은 객체에 대한 참조를 얻게됩니다.

따라서 귀하가하는 일은 Session.Merge를 호출하여 객체를 병합하거나 Session.Get (PrimaryKey)를 통화하여 세션을 요청하고 세션을 플러시하여 세션을 요청합니다.

그러나 Steve가 제안한대로 - 이것은 일반적으로 당신이하는 일이 아닙니다. 당신은 실제로 데이터 스토어에서 도메인 오브젝트를 가져 와서 데이터를 UI로 전송하기 위해 DTOS (필요한 경우)를 사용하고 싶습니다.

다른 사람들이 언급 한 바와 같이, Equals와 gethashcode를 구현하는 것은 올바른 방향의 단계입니다. 또한 "첨부"또는/m 관용구에 대한 Nhibernate의 지원을 살펴보십시오.

당신은 또한 당신의 처분에 nosetter.camelcase 옵션을 가지고 있습니다. http://davybrion.com/blog/2009/03/entities-required-properties-and-properties-that-shouldnt-be-modified/

또한 온라인에서 정보가 부족하여 설득되지 않도록 격려하고 싶습니다. 그것은 당신이 미쳤거나 잘못한 것을 의미하지 않습니다. 그것은 당신이 가장자리 케이스에서 일하고 있음을 의미합니다. 불행히도 Nhibernate와 같은 라이브러리의 가장 큰 소비자는 사내 및/또는 웹 앱으로, 단일 데이터베이스에 대해 모든 지속성 요구를 자유롭게 유지할 수있는 자유가 있습니다. 실제로이 규칙에는 많은 예외가 있습니다.

예를 들어, 현재 내 도메인 객체 중 하나에 SQL CE 데이터베이스와 디스크의 이미지 파일 사이에 데이터 스프레드가있는 상용 데스크톱 앱을 연구하고 있습니다. 불행히도 nhibernate는 SQL CE 지속성에만 도움이 될 수 있습니다. 나는 일종의 "이중 매핑"을 사용해야합니다 (참조 Martin Fowler의 "Enterprise Application Architecture의 패턴") NHibernate에 어떤 데이터와 디스크 해야하는지 알고있는 저장소 레이어를 통해 내 도메인 모델을 매핑하십시오.

발생합니다. 정말 필요합니다. 때로는 도구가없는 명백한 부족으로 인해 나쁜 접근 방식을 취하고 있음을 나타냅니다. 그러나 때로는 진실은 당신이 진정으로 가장자리에 있고,이 패턴 중 일부를 쌓아야한다는 것입니다.

나는 이것이 같은 세션에서 첫 번째 CustomerDTO를 꺼내고 반환이 앞뒤로 변환 되었기 때문에 동일한 개체로 인식 할 수 없다고 가정합니다.

당신이 맞습니다. 최대 절전 모드는 할 수 없습니다. 이 문제를 해결하려면 Equals 및 Hashcode 구현을 고려하십시오. 이 세션 내에서 객체를로드하지 않은 경우에만 재사용 할 수 있다고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top