2011-02-03 17 views
3

ReferencesのいずれかのプロパティにPropertyRefを使用しています。 LazyLoad()では、SalesPersonプロパティに「ヒット」することはありませんが、Selectを実行してUserエンティティを読み込みます。Fluent-Nhibernateの参照とPropertyRef遅延ロードでの選択

注文マッピング

Id(x => x.Id).GeneratedBy.Native(); 
References(x => x.SalesPerson) 
         .LazyLoad() 
         .PropertyRef(x => x.Username) 
         .Column("rsm"); 
Map(x => x.Title); 

注文クラス

public class Order : BaseEntity 
{ 
    ... 
    public virtual User SalesPerson { get; set; } 
    public virtual string Title { get; set; } 
    ... 
} 

ユーザーマッピング

Id(x => x.Id).GeneratedBy.Native(); 
Map(x => x.Username).Column("login"); 

ユーザークラス

public class User : BaseEntity 
{ 
    public virtual string Username { get; set; } 
    ... 
} 

生成された注文のマッピング

<many-to-one class="Project.User" lazy="proxy" name="SalesPerson" property-ref="Username"> 
     <column name="rsm" /> 
</many-to-one> 

実行されるコード

var order = session.Get<Order>(1); 
Console.WriteLine(order.Title); 

は、私はUserエンティティをロードするための選択を防ぐために、とにかくありエンティティUserを使用していませんか?

答えて

2

は、プロパティ-refの参照、あなたが尋ねたこと NHibernate creates proxy via session.Load(), but not via Linq or Criteria API

ではなく、参照するだけでなく、多対1のプロキシでは、あなたのサブクラスユーザーならば、あなたは型チェックを行うことができないことを考えると関係しています http://ayende.com/Blog/archive/2010/01/28/nhibernate-new-feature-no-proxy-associations.aspx

+0

実際のIDを使用するようにスキーマを変更しようとしていると思うが、このすべてのことは面倒なことではなく、悪い習慣である。リンクありがとう。 – mxmissile

1

これはNHibernateのバグではないと思います。あなたのマッピングによって異なります。

まず、参照マップが2つのマッピングテーブル間のキー(主キーと外部キー)を結合することに注意してください。 SELECT + 1を防ぐには、キージョイントを無視します。

References(x => x.SalesPerson) 
        .LazyLoad() 
        .PropertyRef(x => x.Username) 
        WithForeignKeyName("none") //disable key join. 
関連する問題