2011-08-07 6 views
2

나는이 일을 해요 :NHibernate에 이드를 설정하지 않습니다() ASP.net MVC와

[HttpPost] 
[TransactionFilter] 
public ActionResult Create(User user) 
{ 
    // Ommited some things for the sake of brevity 
    _userRepository.Add(user); 
    return RedirectToAction("Details", new { Id = user.Id }); 
} 

이 내가 예상대로 작동합니다. 지금은이 작업을 수행하기 위해 노력하고있어 : userChild.Id가 null이기 때문에

[HttpPost] 
[TransactionFilter] 
public ActionResult Create(User user, ChildOfUser userChild) 
{ 
    // Ommited some things for the sake of brevity 
    var parent = _userRepository.GetById(user.Id); 
    parent.Children.Add(userChild); 

    return RedirectToAction("Details", new { Id = userChild.Id }); 
} 

이 실패합니다. 첫 번째 사례는 Repo에서 session.Save(user);을 호출하기 때문에 작동하며이 호출은 user.Id 속성을 변경합니다.

(사용자) parent.Children.Add(userChild); 호출은 userChild.Id 속성을 변경하지 않습니다. transaction.Commit();을 호출 한 후에 만 ​​userChild.Id가 의미있는 값을 갖습니다. userChild를 콜렉션에 추가하여 이드가 설정 될 것으로 기대한다.

이제 NHibernate가이를 처리해야합니까? 아니면 내 기대가 잘못 되었습니까? Hibernate가 이것을 처리하게하는 방법이 있다면 그것은 굉장 할 것이다.

편집 이 경우의 Id는 항상 GUID입니다. 내가 그들 자신을 설정할 수 있습니까? (그들은 입니다. 세계적으로 고유 권한 ...), 그리고 그 자체로 ID를 생성 한 것처럼 NHibernate에서 사용할 것입니까?

+1

편집 : 예 NHibernate가이를 사용하고 클라이언트 측에서 생성 한 ID (예 : GUID 또는 HiLo)가 ORM, 결과적으로 응용 프로그램에 성능 친화적입니다.미리 생성 된 ID를 사용하면 상위 ID를 가져 오는 데 더 이상 db 왕복이 필요하지 않습니다. 포스트 생성 ID는 테이블을 잠그는 경향이 있으며 모든 ID 리퀘 스터는 특히 테이블이 트랜잭션에 포함되어있는 경우 ID 생성을 기다려야합니다. –

답변

0

나는 그래도 난이 연습을 권하고 싶지 않다

.Add을 사용한 후 ISession.Flush() 메소드를 사용하여 해결이 특정 문제를() 했어. 요즘 엔티티 생성자에서 Guid Id를 즉시 설정합니다. 이것은 MVC와 NHibernate 모두를 행복하게 만든다.

3

parent.Children.Add(userChild);은 Hibernate를 .NET으로 포팅하기 훨씬 전에 NHibernate에 아무런 영향을 미치지 않는다. 메모리 내 연산이다. 실제로는 .NET의 기본 라이브러리의 일부이다. collection.Add가 NHibernate 연산이 아니다.

transaction.Commit(); userChild.Id는 의미가있는 값인 입니다. 나는이 ID가 userChild를 콜렉션에 추가하여 설정 될 것으로 기대한다.

당신이 관찰 한 것은 정확합니다. 객체에 대한 NHibernate의 역할은 Save/Commit을 호출 할 때만 재생됩니다.

+2

이론적으로, NHibernate는 콜렉션을 프록시 할 수 있고, Add (Cascade가 가능할 때)에서'session.Save (item)'을 호출 할 수있다. 그렇지 않으면 userChild 저장소를 사용하여 삭제해야한다는 뜻입니다. 그리고 그것은 DDD의 총 근본 원칙을 따르지 않습니다. (오직 루트에 집계가 있습니다.) – dvdvorle

+1

집계 루트에서 삭제할 수 있습니다. Hibernate는 자식 엔티티도 행복하게 삭제할 수 있습니다. –

+0

내 잘못, 나는 "삭제/삭제"라고 말한 "추가/저장"을 의미했습니다. – dvdvorle

1

이제 NHibernate가이를 처리해야합니까?

아니요. 이것은 Unit of Work 패턴 때문입니다. 작업 단위 패턴의 추론은 실용적이며 데이터베이스에 대한 트랜잭션 및 왕복 횟수를 줄이는 것과 관련이 있습니다. 작업 단위 (UOW) 패턴을 사용하는 또 다른 이유는 비즈니스 단위에서 작업 단위 (UOW)와 정렬된다는 것입니다. 작업 단위는 비즈니스 도메인에서 조작의 경계를 정의합니다. NHibernate는 비지니스 도메인의 성격을 알지 못하기 때문에 작업 단위의 선언은 클라이언트에게 위임된다. 또한, 작업 단위 선언을 지속성 계층 외부로 위임하는 것이 종종 유익합니다. 예제는 this 질문을 참조하십시오.

관련 문제