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