2011-08-01 11 views
0

のIDのみを取得します:私は私はこのマッピング持っている私のManyToOneオブジェクト

Session.Get<Foo>(1).Bar.Idを行うことができます知っている

SELECT bar_id FROM foo f WHERE f.id = 1 

[Class(Table = "foo", Name = "Foo")] 
public class Foo 
{ 
    [Id(0, TypeType = typeof(long), Name = "Id", Column = "id")] 
    [Generator(1, Class = "native")] 
    public virtual long Id { get; set; } 

    [ManyToOne(Class = "Bar", Column = "bar_id", NotNull = true)] 
    public virtual Bar Bar { get; set; } 
} 

[Class(Table = "bar", Name = "Bar")] 
public class Bar 
{ 
    [Id(0, TypeType = typeof(long), Name = "Id", Column = "id")] 
    [Generator(1, Class = "native")] 
    public virtual long Id { get; set; } 

    [Bag(0, Inverse = true, Table = "foo", Cascade = "save-update")] 
    [Key(1, Column = "bar_id", ForeignKey = "fk_foo_bar_id")] 
    [OneToMany(2, Class = "Foo")] 
    public virtual IList<Foo> Foos { get; set; } 
} 

と私はSQLクエリをやりたいがしかし、それはBarオブジェクトをロードし、それが非常にHEAVYオブジェクトの場合、私の単純なクエリは、fooテーブルが非常に遅いです。私はどうすればいいのですか?私はそれを違ったかどう

私はこの

[Property(Column = "bar_id", NotNull = true)] 
public virtual long BarId { get; set; } 

のようにプロパティを追加することを考えました。しかし、それは間違っているかどうかはわからない、または。

答えて

0

は最後に、私たちはこのようにそれをやった:

public class FooToBarResult 
{ 
    public string FooId { get; set; } 
    public int BarId { get; set; } 
} 

IList<BlockToComponentResult> result = session 
     .CreateSQLQuery(@"SELECT bar_id as BarId, id as FooId FROM `foo`") 
     .SetResultTransformer(Transformers.AliasToBean<FooToBarResult>()) 
     .List<FooToBarResult>(); 

私の結論は、NHibernateのは、すぐにあなたには、いくつかのパフォーマンスの問題を持っているし、最適化したいとあなたが行う場合、彼らはあなたがやりたいものだけを、涼しいですが、ということですクエリ、あなたはSQLに戻ってくる必要があり、痛みが始まります。

0

NHibernate support lazy properties。それがあなたの問題を解決するかどうかを確認してください。

+0

はい私は遅延ロードについて知っていますが、私は2番目のBarオブジェクトでそれを変更することはできません。実際に私はちょうど私のNHibernateが私の最初のオブジェクトFooの内部にある何かのために、オブジェクトバーをロードするように強制しない... –

+0

それは怠惰な読み込みではない、それは怠惰なプロパティです...あなたはかさばるフィールドがある場合(マッピングではない)、あなたは怠け者としてマークすることができます。それについてのayendeの記事をチェックしてください。 – Illuminati

+0

申し訳ありませんが、私はこの記事について知っていました。私はコード内で他の場所を使用しています。私の問題は、他のコードを破る可能性があるため、属性を変更してLazyとしてプロパティを変更できないことです。 –

0

Session.Load<Foo>(id)をお試しください。

NHibernateは、BarをロードしてそのIDだけを含むプロキシバージョンを生成する必要がないことを認識するほどスマートでなければなりません。他のプロパティにアクセスした場合にのみBarをロードします。

しかし、Session.Get()does not do thisはキャッシュを使用しているためです。しかし、これを変更してSession.Load<Foo>(id)を使用する場合は、この動作を確認する必要があります。

+0

あなたは、(id)をロードしますか?ここで私はバーのIDを知らないので、これは私が欲しいものです –

+0

はい、申し訳ありません。編集されました。 –

+0

、次にSession.Load (id).Bar.Idを実行すると、Barオブジェクトがロードされず、Bar.Idプロパティだけがロードされると思いますか? –