2012-03-13 1 views
1

나는 PersonPosition이라는 두 개의 엔티티 클래스가 있습니다.NHibernate를 사용하여 객체를 가져 오지 않고 관계 설정하기

public class Person 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual Position Position { get; set; } 
} 

public class Position 
{ 
    public virtual int Id { get; set; } 
    public virtual string Code { get; set; } 
} 

PersonPosition와 일대 다 관계를 갖는다. 나는 또한 클라이언트로부터 사람 데이터를 가져 오는 DTO PersonDto을 가지고있다.

public class PersonDto 
{ 
    public string Name { get; set; } 
    public int PositionId { get; set; } 
} 

내가 DTO를 얻을 후 나는 새로운 Person 객체를 생성해야하고 그것을 유지됩니다. 보통은 다음과 같습니다

내가이 줄을 제거 할 수 있다면 궁금
var person = new Person(); 
CopyFromDto(person, personDto); 
var position = positionRepository.GetById(personDto.PositionId); 
person.Position = position; 
personRepository.Save(person); 

:

var position = positionRepository.GetById(personDto.PositionId); 

이유는 어떤 위치 데이터를 가져 불필요한 SQL 쿼리를 생성하는 것입니다. 어떻게 든 NHibernate에 위치 ID를 제공하고 사람 행을 저장하는 것이 가능합니까?

미리 감사드립니다.

답변

2

사용 ISession.Load : ISession의

부하() 메소드가 당신이 이미 식별자를 알고있는 경우 영구적 인 인스턴스를 검색하는 방법을 제공합니다.

데이터베이스 행과 일치하지 않으면 Load()가 복구 할 수없는 예외를 throw합니다. 클래스가 프록시로 매핑 된 경우 Load() 은 초기화되지 않은 프록시 인 객체를 반환하며 실제로 객체의 메소드를 호출 할 때까지 데이터베이스를 조회하지 않습니다. 이 객체는 실제로 데이터베이스에서로드하지 않고 객체에 대한 연결을 만들려는 경우 매우 유용합니다.

http://www.nhforge.org/doc/nh/en/index.html#manipulatingdata-loading

관련 문제