2012-03-13 8 views
1

私は2つのエンティティクラス、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と1対多の関係を持っています。私もクライアントから人のデータをもたらす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()は回復不能な例外をスローします。クラスがプロキシにマップされている場合、Load() は、初期化されていないプロキシであるオブジェクトを返します。オブジェクトのメソッドを呼び出すまで、実際には はデータベースにアクセスしません。この の動作は、 オブジェクトへの関連付けを実際にデータベースからロードせずに作成する場合に非常に便利です。

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

関連する問題